// $ANTLR 3.1 plp4.g 2012-06-29 02:45:57

	import java.lang.String;
	import java.util.ArrayList;


import org.antlr.runtime.*;
import java.util.Stack;
import java.util.List;
import java.util.ArrayList;

public class plp4Parser extends Parser {
    public static final String[] tokenNames = new String[] {
        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "CLASS", "ID", "LLAVEI", "LLAVED", "PUBLIC", "STATIC", "VOID", "MAIN", "PARI", "PARD", "INT", "DOUBLE", "BOOL", "CONST", "COMA", "PYC", "ASIG", "ENTERO", "REAL", "BOOLEANO", "CORI", "CORD", "IF", "ELSE", "WHILE", "FOR", "TO", "STEP", "ADDOP", "BREAK", "CONTINUE", "NEW", "WRITELINE", "TRY", "THROW", "EXCEPTION", "EXPLAIN", "RETURN", "CATCH", "PUNTO", "READLINE", "OR", "AND", "RELOP", "MULOP", "NOT", "PRIVATE", "PROPERTY", "GET", "SET", "NEWline", "COMENTARIO", "COMENTARIOSIMPLE", "SINGLE", "FOREACH", "VAR", "IN"
    };
    public static final int MAIN=11;
    public static final int CLASS=4;
    public static final int WHILE=28;
    public static final int CONST=17;
    public static final int NEW=35;
    public static final int FOR=29;
    public static final int STEP=31;
    public static final int MULOP=48;
    public static final int NOT=49;
    public static final int PARI=12;
    public static final int ADDOP=32;
    public static final int AND=46;
    public static final int ID=5;
    public static final int EOF=-1;
    public static final int BREAK=33;
    public static final int PARD=13;
    public static final int IF=26;
    public static final int EXPLAIN=40;
    public static final int LLAVEI=6;
    public static final int ENTERO=21;
    public static final int IN=60;
    public static final int CONTINUE=34;
    public static final int COMENTARIO=55;
    public static final int LLAVED=7;
    public static final int RETURN=41;
    public static final int DOUBLE=15;
    public static final int GET=52;
    public static final int VAR=59;
    public static final int VOID=10;
    public static final int COMENTARIOSIMPLE=56;
    public static final int EXCEPTION=39;
    public static final int READLINE=44;
    public static final int TO=30;
    public static final int PRIVATE=50;
    public static final int STATIC=9;
    public static final int ELSE=27;
    public static final int BOOL=16;
    public static final int CORD=25;
    public static final int SET=53;
    public static final int PYC=19;
    public static final int INT=14;
    public static final int COMA=18;
    public static final int TRY=37;
    public static final int PUNTO=43;
    public static final int REAL=22;
    public static final int SINGLE=57;
    public static final int PROPERTY=51;
    public static final int OR=45;
    public static final int BOOLEANO=23;
    public static final int NEWline=54;
    public static final int CORI=24;
    public static final int FOREACH=58;
    public static final int ASIG=20;
    public static final int WRITELINE=36;
    public static final int CATCH=42;
    public static final int PUBLIC=8;
    public static final int THROW=38;
    public static final int RELOP=47;

    // delegates
    // delegators


        public plp4Parser(TokenStream input) {
            this(input, new RecognizerSharedState());
        }
        public plp4Parser(TokenStream input, RecognizerSharedState state) {
            super(input, state);
             
        }
        

    public String[] getTokenNames() { return plp4Parser.tokenNames; }
    public String getGrammarFileName() { return "plp4.g"; }


    	private TSimbolos tSimbolos = new TSimbolos(null,null);
    	private TClases tClases = new TClases();
    	public int posicionSimbolo=0;
    	public int maxPila = 100;
    	public boolean enCatch = false;
    	public String excepcion = "";
    	public int fila, columna;
    	public String error;

    	public String ponBlancos(int num) {
    	        String cad = "";
    	        for (int i = 0; i < num * 4; i++) {
    	            cad += " ";
           	 	}
            	return cad;
        	}
        	
        	private void ErrorSem1(int fila, int columna, String disfunka)
    	{
    		columna++;
    		System.err.println("Error 1 ("+fila+","+columna+"): '"+ disfunka +"' ya existe en este ambito");
    		System.exit(5);
    	}

    	private void ErrorSem2(int fila, int columna, String disfunka)
    	{
    		columna++;
    		System.err.println("Error 2 ("+fila+","+columna+"): simbolo '"+ disfunka +"' no ha sido declarado");
    		System.exit(5);
    	}

    	private void ErrorSem3(int fila, int columna, String disfunka)
    	{
    		columna++;
    		System.err.println("Error 3 ("+fila+","+columna+"): tipo incompatible en operador aritmetico '"+ disfunka +"'");
    		System.exit(5);
    	}

    	private void ErrorSem4(int fila, int columna, String disfunka)
    	{
    		columna++;
    		System.err.println("Error 4 ("+fila+","+columna+"): tipo incompatible en operador logico '"+ disfunka +"'");
    		System.exit(5);
    	}

    	private void ErrorSem5(int fila, int columna, String disfunka)
    	{
    		columna++;
    		System.err.println("Error 5 ("+fila+","+columna+"): la expresion debe ser de tipo booleano en la instruccion '"+ disfunka +"'");
    		System.exit(5);
    	}

    	private void ErrorSem6(int fila, int columna, String disfunka)
    	{
    		columna++;
    		System.err.println("Error 6 ("+fila+","+columna+"): tipos incompatibles en la instruccion de asignacion");
    		System.exit(5);
    	}

    	private void ErrorSem7(int fila, int columna, String disfunka)
    	{
    		columna++;
    		System.err.println("Error 7 ("+fila+","+columna+"): tipos incompatibles en la instruccion de lectura");
    		System.exit(5);
    	}

    	private void ErrorSem8(int fila, int columna, String disfunka)
    	{
    		columna++;
    		System.err.println("Error 8 ("+fila+","+columna+"): tamanyo incorrecto");
    		System.exit(5);
    	}
    	private void ErrorSem9(int fila, int columna, String disfunka)
    	{
    		columna++;
    		System.err.println("Error 9 ("+fila+","+columna+"): numero insuficiente de indices en el array '"+ disfunka +"'");
    		System.exit(5);
    	}


    	private void ErrorSem10(int fila, int columna, String disfunka)
    	{
    		columna++;
    		System.err.println("Error 10 ("+fila+","+columna+"): numero de dimensiones incorrecto");
    		System.exit(5);
    	}

    	private void ErrorSem11(int fila, int columna, String disfunka)
    	{
    		columna++;
    		System.err.println("Error 11 ("+fila+","+columna+"): el identificador '"+ disfunka +"' no es de tipo array");
    		System.exit(5);
    	}

    	private void ErrorSem12(int fila, int columna, String disfunka)
    	{
    		columna++;
    		System.err.println("Error 12 ("+fila+","+columna+"): demasiados indices");
    		System.exit(5);
    	}

    	private void ErrorSem13(int fila, int columna, String disfunka)
    	{
    		columna++;
    		System.err.println("Error 13 ("+fila+","+columna+"): indice de tipo incompatible");
    		System.exit(5);
    	}

    	private void ErrorSem14(int fila, int columna, String disfunka)
    	{
    		columna++;
    		System.err.println("Error 14 ("+fila+","+columna+"): tipo '" + disfunka +"' incompatible con la declaracion");
    		System.exit(5);
    	}

    	private void ErrorSem15(int fila, int columna, String disfunka)
    	{
    		columna++;
    		System.err.println("Error 15 ("+fila+","+columna+"): la variable que se intenta modificar es de solo lectura");
    		System.exit(5);
    	}

    	private void ErrorSem16(int fila, int columna, String disfunka)
    	{
    		columna++;
    		System.err.println("Error 16 ("+fila+","+columna+"): instruccion '" + disfunka +"' no permitida fuera de un bucle");
    		System.exit(5);
    	}

    	private void ErrorSem17(int fila, int columna, String disfunka)
    	{
    		columna++;
    		System.err.println("Error 17 ("+fila+","+columna+"): la expresion debe ser de tipo numerico");
    		System.exit(5);
    	}
    	
    	private void ErrorSem18(int fila, int columna, String lexema)
    	{
    		columna++;
    		System.err.println("Error 18 ("+fila+","+columna+"): sentencia '"+ lexema + "' no permitida en este ambito");
    		System.exit(5);
    	}
    	
    	private void ErrorSem19(int fila, int columna, String lexema)
    	{
    		columna++;
    		System.err.println("Error 19 ("+fila+","+columna+"): '"+ lexema + "' no es una excepcion");
    		System.exit(5);
    	}
    	
    	private void ErrorSem20(int fila, int columna, String lexema)
    	{
    		columna++;
    		System.err.println("Error 20 ("+fila+","+columna+"): La propiedad '"+ lexema + "' debe definir al menos un accesor");
    		System.exit(5);
    	}
    	
    	private void ErrorSem21(int fila, int columna, String lexema)
    	{
    		columna++;
    		System.err.println("Error 21 ("+fila+","+columna+"): La propiedad '"+ lexema + "' no puede consultarse");
    		System.exit(5);
    	}
    	
    	private void ErrorSem22(int fila, int columna, String lexema)
    	{
    		columna++;
    		System.err.println("Error 22: debe existir un unico metodo Main");
    		System.exit(5);
    	}
    	
    	private void ErrorSem23(int fila, int columna, String lexema)
    	{
    		columna++;
    		System.err.println("Error 23 ("+fila+","+columna+"): identificador '"+ lexema + "' usado incorrectamente");
    		System.exit(5);
    	}
    	
    	private void ErrorSem24(int fila, int columna, String lexema)
    	{
    		columna++;
    		System.err.println("Error 24 ("+fila+","+columna+"): el metodo '"+ lexema + "' ya esta definido");
    		System.exit(5);
    	}
    	
    	private void ErrorSem25(int fila, int columna, String lexema)
    	{
    		columna++;
    		System.err.println("Error 25 ("+fila+","+columna+"): el metodo '"+ lexema + "' no esta definido");
    		System.exit(5);
    	}
    	
    	private void ErrorSem26(int fila, int columna, String lexema)
    	{
    		columna++;
    		System.err.println("Error 26 ("+fila+","+columna+"): aqui no puede usarse return");
    		System.exit(5);
    	}
    	
    	private void ErrorSem27(int fila, int columna, String lexema)
    	{
    		columna++;
    		System.err.println("Error 27 ("+fila+","+columna+"): valor devuelto de tipo incompatible");
    		System.exit(5);
    	}
    	private void ErrorSem28(int fila, int columna, String lexema)
    	{
    		columna++;
    		System.err.println("Error 28 ("+fila+","+columna+"): tipo incompatible en el parametro");
    		System.exit(5);
    	}
    	private void ErrorSem29(int fila, int columna, String lexema)
    	{
    		columna++;
    		System.err.println("Error 29 ("+fila+","+columna+"): no se permite la declaracion de arrays de objetos");
    		System.exit(5);
    	}
    	private void ErrorSem30(int fila, int columna, String lexema, String lexema2)
    	{
    		columna++;
    		System.err.println("Error 30 ("+fila+","+columna+"): el objeto '"+ lexema + "' no es de clase '" + lexema2 + "'");
    		System.exit(5);
    	}
    	private void ErrorSem31(int fila, int columna, String lexema)
    	{
    		columna++;
    		System.err.println("Error 31 ("+fila+","+columna+"): miembro '"+ lexema + "' no accesible desde Main");
    		System.exit(5);
    	}private void ErrorSem32(int fila, int columna, String lexema)
    	{
    		columna++;
    		System.err.println("Error 32 ("+fila+","+columna+"): la referencia es de tipo objeto");
    		System.exit(5);
    	}
    	private void ErrorSem33(int fila, int columna, String lexema)
    	{
    		columna++;
    		System.err.println("Error 33 ("+fila+","+columna+"): tipo incompatible con el operador relacional '"+ lexema + "'");
    		System.exit(5);
    	}
    	private void ErrorSem34(int fila, int columna, String lexema)
    	{
    		columna++;
    		System.err.println("Error 34 ("+fila+","+columna+"): constructor usado incorrectamente");
    		System.exit(5);
    	}
    	private void ErrorSem35(int fila, int columna, String lexema)
    	{
    		columna++;
    		System.err.println("Error 35 ("+fila+","+columna+"): un constructor no puede devolver nada");
    		System.exit(5);
    	}
    	private void ErrorSem36(int fila, int columna, String lexema)
    	{
    		columna++;
    		System.err.println("Error 36 ("+fila+","+columna+"): un metodo debe devolver algo");
    		System.exit(5);
    	}

    	public void emitErrorMessage(String mensaje)
    	{
    		System.err.println(mensaje);
    		System.exit(1);
    	}





    // $ANTLR start "s"
    // plp4.g:292:1: s[String entrada] returns [String eixida] : ( clase )+ ;
    public final String s(String entrada) throws RecognitionException {
        String eixida = null;

        String clase1 = null;



        		eixida = "";
        	
        try {
            // plp4.g:295:3: ( ( clase )+ )
            // plp4.g:296:2: ( clase )+
            {

            		eixida+= ".assembly extern mscorlib{}\n" +
            			  ".assembly '" + entrada +"' {}\n";
            	
            // plp4.g:300:2: ( clase )+
            int cnt1=0;
            loop1:
            do {
                int alt1=2;
                int LA1_0 = input.LA(1);

                if ( (LA1_0==CLASS) ) {
                    alt1=1;
                }


                switch (alt1) {
            	case 1 :
            	    // plp4.g:300:3: clase
            	    {
            	    pushFollow(FOLLOW_clase_in_s53);
            	    clase1=clase();

            	    state._fsp--;


            	    		eixida += clase1;
            	    	

            	    }
            	    break;

            	default :
            	    if ( cnt1 >= 1 ) break loop1;
                        EarlyExitException eee =
                            new EarlyExitException(1, input);
                        throw eee;
                }
                cnt1++;
            } while (true);


            }

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return eixida;
    }
    // $ANTLR end "s"


    // $ANTLR start "clase"
    // plp4.g:306:1: clase returns [String eixida] : CLASS ID LLAVEI ( miembro[clase] )+ LLAVED ;
    public final String clase() throws RecognitionException {
        String eixida = null;

        Token ID2=null;
        plp4Parser.miembro_return miembro3 = null;



        		eixida = "";
        		Simbolo clase = null;
        		
        	
        try {
            // plp4.g:311:3: ( CLASS ID LLAVEI ( miembro[clase] )+ LLAVED )
            // plp4.g:312:2: CLASS ID LLAVEI ( miembro[clase] )+ LLAVED
            {
            match(input,CLASS,FOLLOW_CLASS_in_clase76); 
            ID2=(Token)match(input,ID,FOLLOW_ID_in_clase78); 

            		
            	
            match(input,LLAVEI,FOLLOW_LLAVEI_in_clase82); 

            		eixida+= ".class "+ (ID2!=null?ID2.getText():null) + " extends [mscorlib]System.Object {\n" +
            			".method public specialname rtspecialname instance void .ctor() cil managed\n{"+
            			".maxstack 1\nldarg.0\ncall instance void [mscorlib]System.Object::.ctor()\nret\n}\n";
            		clase = tClases.nuevo((ID2!=null?ID2.getText():null));
            		tSimbolos = new TSimbolos(null,clase);
            		if (clase == null){
            			//CLASE YA DECLARADA, ERROR??
            		
            		}
            		
            	
            // plp4.g:326:3: ( miembro[clase] )+
            int cnt2=0;
            loop2:
            do {
                int alt2=2;
                int LA2_0 = input.LA(1);

                if ( (LA2_0==PUBLIC||(LA2_0>=PRIVATE && LA2_0<=PROPERTY)) ) {
                    alt2=1;
                }


                switch (alt2) {
            	case 1 :
            	    // plp4.g:327:2: miembro[clase]
            	    {
            	    pushFollow(FOLLOW_miembro_in_clase88);
            	    miembro3=miembro(clase);

            	    state._fsp--;

            	    		
            	    	eixida += (miembro3!=null?miembro3.eixida:null) + "}\n";
            	    	

            	    }
            	    break;

            	default :
            	    if ( cnt2 >= 1 ) break loop2;
                        EarlyExitException eee =
                            new EarlyExitException(2, input);
                        throw eee;
                }
                cnt2++;
            } while (true);

            match(input,LLAVED,FOLLOW_LLAVED_in_clase95); 

            		tSimbolos = tSimbolos.pop();
            	

            }

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return eixida;
    }
    // $ANTLR end "clase"

    public static class metodo_return extends ParserRuleReturnScope {
        public String eixida;
        public Simbolo smetodo;
        public Simbolo.TipoRetorno tipo;
    };

    // $ANTLR start "metodo"
    // plp4.g:335:1: metodo[Simbolo clase] returns [String eixida, Simbolo smetodo, Simbolo.TipoRetorno tipo] : ( PUBLIC STATIC VOID MAIN PARI PARD bloque[true] | visibilidad ( tiposimple )? ID PARI args PARD bloque[true] );
    public final plp4Parser.metodo_return metodo(Simbolo clase) throws RecognitionException {
        plp4Parser.metodo_return retval = new plp4Parser.metodo_return();
        retval.start = input.LT(1);

        Token ID6=null;
        plp4Parser.bloque_return bloque4 = null;

        plp4Parser.tiposimple_return tiposimple5 = null;

        plp4Parser.args_return args7 = null;

        plp4Parser.visibilidad_return visibilidad8 = null;

        plp4Parser.bloque_return bloque9 = null;



        		retval.eixida = "";
        		String locales="";
        		retval.tipo = Simbolo.TipoRetorno.REAL;
        		//tSimbolos = null;
        		
        	
        try {
            // plp4.g:342:3: ( PUBLIC STATIC VOID MAIN PARI PARD bloque[true] | visibilidad ( tiposimple )? ID PARI args PARD bloque[true] )
            int alt4=2;
            int LA4_0 = input.LA(1);

            if ( (LA4_0==PUBLIC) ) {
                int LA4_1 = input.LA(2);

                if ( (LA4_1==STATIC) ) {
                    alt4=1;
                }
                else if ( (LA4_1==ID||(LA4_1>=INT && LA4_1<=BOOL)) ) {
                    alt4=2;
                }
                else {
                    NoViableAltException nvae =
                        new NoViableAltException("", 4, 1, input);

                    throw nvae;
                }
            }
            else if ( (LA4_0==PRIVATE) ) {
                alt4=2;
            }
            else {
                NoViableAltException nvae =
                    new NoViableAltException("", 4, 0, input);

                throw nvae;
            }
            switch (alt4) {
                case 1 :
                    // plp4.g:343:2: PUBLIC STATIC VOID MAIN PARI PARD bloque[true]
                    {
                    match(input,PUBLIC,FOLLOW_PUBLIC_in_metodo117); 
                    match(input,STATIC,FOLLOW_STATIC_in_metodo119); 
                    match(input,VOID,FOLLOW_VOID_in_metodo121); 
                    match(input,MAIN,FOLLOW_MAIN_in_metodo123); 

                    		if(tSimbolos.busca("Main")!=null){
                    			//ERRORACO
                    		}	
                    		clase.tabla.nuevo("Main",Simbolo.TipoRetorno.VOID,Simbolo.ClaseDato.METODO);
                    		retval.smetodo = tSimbolos.busca("Main");
                    		tSimbolos = new TSimbolos(tSimbolos,retval.smetodo);
                    		//retval.smetodo.simboloPadre = clase;
                    	
                    match(input,PARI,FOLLOW_PARI_in_metodo126); 
                    match(input,PARD,FOLLOW_PARD_in_metodo128); 
                    pushFollow(FOLLOW_bloque_in_metodo131);
                    bloque4=bloque(true);

                    state._fsp--;


                    		retval.eixida+=".method static public void main () cil managed\n{\n.entrypoint\n.maxstack " +
                    		(maxPila) +"\n.locals(" + (bloque4!=null?bloque4.locals:null).substring(0,(bloque4!=null?bloque4.locals:null).length()-1) + ")\n" + (bloque4!=null?bloque4.eixida:null) +"ret\n}\n";
                    		tClases.mains++;	
                    		tSimbolos = tSimbolos.pop();
                    	

                    }
                    break;
                case 2 :
                    // plp4.g:359:2: visibilidad ( tiposimple )? ID PARI args PARD bloque[true]
                    {
                    pushFollow(FOLLOW_visibilidad_in_metodo139);
                    visibilidad8=visibilidad();

                    state._fsp--;

                    // plp4.g:359:13: ( tiposimple )?
                    int alt3=2;
                    int LA3_0 = input.LA(1);

                    if ( ((LA3_0>=INT && LA3_0<=BOOL)) ) {
                        alt3=1;
                    }
                    switch (alt3) {
                        case 1 :
                            // plp4.g:359:14: tiposimple
                            {
                            pushFollow(FOLLOW_tiposimple_in_metodo141);
                            tiposimple5=tiposimple();

                            state._fsp--;


                            		retval.tipo = (tiposimple5!=null?tiposimple5.tipo:null);
                            		//dolarlocales = dolartiposimple.locals;
                            	
                            	
                            	

                            }
                            break;

                    }

                    ID6=(Token)match(input,ID,FOLLOW_ID_in_metodo146); 
                    match(input,PARI,FOLLOW_PARI_in_metodo148); 
                    pushFollow(FOLLOW_args_in_metodo150);
                    args7=args();

                    state._fsp--;

                    match(input,PARD,FOLLOW_PARD_in_metodo152); 

                    		Simbolo saux = new Simbolo((ID6!=null?ID6.getText():null), retval.tipo, Simbolo.ClaseDato.METODO,clase.tabla,0);
                    		tSimbolos = new TSimbolos(tSimbolos,saux);
                    		saux.params = (args7!=null?args7.params:null);
                    		saux.tabla = tSimbolos;
                    	
                    pushFollow(FOLLOW_bloque_in_metodo155);
                    bloque9=bloque(true);

                    state._fsp--;


                    		
                    		if(!tSimbolos.existe(saux)){
                    			//saux.simboloPadre = clase;

                    			clase.tabla.nuevoAPelo(saux);
                    			
                    			
                    			retval.eixida+=".method static "+ (visibilidad8!=null?visibilidad8.eixida:null)+" " + locales +" "+ (ID6!=null?ID6.getText():null)+ "("+ (args7!=null?args7.eixida:null) +") cil managed\n{\n.maxstack " +
                    			(maxPila) +"\n.locals(" + (bloque9!=null?bloque9.locals:null).substring(0,(bloque9!=null?bloque9.locals:null).length()-1) + ")\n" + (bloque9!=null?bloque9.eixida:null) +"ret\n}\n";
                    			
                    		} else {
                    			
                    		}
                    		
                    		tSimbolos = tSimbolos.pop();
                    	

                    }
                    break;

            }
            retval.stop = input.LT(-1);

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return retval;
    }
    // $ANTLR end "metodo"

    public static class tiposimple_return extends ParserRuleReturnScope {
        public Simbolo.TipoRetorno tipo;
        public String locals;
    };

    // $ANTLR start "tiposimple"
    // plp4.g:387:1: tiposimple returns [Simbolo.TipoRetorno tipo, String locals] : ( INT | DOUBLE | BOOL );
    public final plp4Parser.tiposimple_return tiposimple() throws RecognitionException {
        plp4Parser.tiposimple_return retval = new plp4Parser.tiposimple_return();
        retval.start = input.LT(1);

        Token INT10=null;
        Token DOUBLE11=null;
        Token BOOL12=null;


        		retval.locals = "";
        	
        try {
            // plp4.g:390:3: ( INT | DOUBLE | BOOL )
            int alt5=3;
            switch ( input.LA(1) ) {
            case INT:
                {
                alt5=1;
                }
                break;
            case DOUBLE:
                {
                alt5=2;
                }
                break;
            case BOOL:
                {
                alt5=3;
                }
                break;
            default:
                NoViableAltException nvae =
                    new NoViableAltException("", 5, 0, input);

                throw nvae;
            }

            switch (alt5) {
                case 1 :
                    // plp4.g:391:2: INT
                    {
                    INT10=(Token)match(input,INT,FOLLOW_INT_in_tiposimple174); 

                    		retval.tipo = Simbolo.TipoRetorno.ENTERO;
                    		fila = (INT10!=null?INT10.getLine():0);
                    		columna = (INT10!=null?INT10.getCharPositionInLine():0);
                    		error = (INT10!=null?INT10.getText():null);
                    		retval.locals = "int32";
                    		
                    	

                    }
                    break;
                case 2 :
                    // plp4.g:399:4: DOUBLE
                    {
                    DOUBLE11=(Token)match(input,DOUBLE,FOLLOW_DOUBLE_in_tiposimple180); 

                    		retval.tipo = Simbolo.TipoRetorno.REAL;
                    		fila = (DOUBLE11!=null?DOUBLE11.getLine():0);
                    		columna = (DOUBLE11!=null?DOUBLE11.getCharPositionInLine():0);
                    		error = (DOUBLE11!=null?DOUBLE11.getText():null);
                    		retval.locals = "float64";
                    	

                    }
                    break;
                case 3 :
                    // plp4.g:406:4: BOOL
                    {
                    BOOL12=(Token)match(input,BOOL,FOLLOW_BOOL_in_tiposimple186); 

                    		retval.tipo = Simbolo.TipoRetorno.BOOLEANO;
                    		fila = (BOOL12!=null?BOOL12.getLine():0);
                    		columna = (BOOL12!=null?BOOL12.getCharPositionInLine():0);
                    		error = (BOOL12!=null?BOOL12.getText():null);
                    		retval.locals = "int32";
                    	

                    }
                    break;

            }
            retval.stop = input.LT(-1);

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return retval;
    }
    // $ANTLR end "tiposimple"

    public static class decl_return extends ParserRuleReturnScope {
        public String eixida;
        public String locals;
        public ArrayList<Simbolo> simbolos;
    };

    // $ANTLR start "decl"
    // plp4.g:414:1: decl returns [String eixida, String locals, ArrayList<Simbolo> simbolos] : ( constdecl | vardecl ) ;
    public final plp4Parser.decl_return decl() throws RecognitionException {
        plp4Parser.decl_return retval = new plp4Parser.decl_return();
        retval.start = input.LT(1);

        plp4Parser.constdecl_return constdecl13 = null;

        plp4Parser.vardecl_return vardecl14 = null;



        		retval.eixida = "";
        		retval.locals = "";
        		retval.eixida = "";
        	
        try {
            // plp4.g:419:3: ( ( constdecl | vardecl ) )
            // plp4.g:420:2: ( constdecl | vardecl )
            {
            // plp4.g:420:2: ( constdecl | vardecl )
            int alt6=2;
            int LA6_0 = input.LA(1);

            if ( (LA6_0==CONST) ) {
                alt6=1;
            }
            else if ( (LA6_0==ID||(LA6_0>=INT && LA6_0<=BOOL)) ) {
                alt6=2;
            }
            else {
                NoViableAltException nvae =
                    new NoViableAltException("", 6, 0, input);

                throw nvae;
            }
            switch (alt6) {
                case 1 :
                    // plp4.g:421:2: constdecl
                    {
                    pushFollow(FOLLOW_constdecl_in_decl207);
                    constdecl13=constdecl();

                    state._fsp--;


                    		retval.locals = (constdecl13!=null?constdecl13.locals:null);
                    		retval.eixida = (constdecl13!=null?constdecl13.eixida:null);
                    		
                    	

                    }
                    break;
                case 2 :
                    // plp4.g:427:2: vardecl
                    {
                    pushFollow(FOLLOW_vardecl_in_decl214);
                    vardecl14=vardecl();

                    state._fsp--;


                    		retval.locals = (vardecl14!=null?vardecl14.locals:null);
                    		retval.simbolos = (vardecl14!=null?vardecl14.simbolos:null);	
                    	

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return retval;
    }
    // $ANTLR end "decl"

    public static class constdecl_return extends ParserRuleReturnScope {
        public String eixida;
        public String locals;
    };

    // $ANTLR start "constdecl"
    // plp4.g:434:1: constdecl returns [String eixida, String locals] : CONST tiposimple c1= constid ( COMA c2= constid )* PYC ;
    public final plp4Parser.constdecl_return constdecl() throws RecognitionException {
        plp4Parser.constdecl_return retval = new plp4Parser.constdecl_return();
        retval.start = input.LT(1);

        plp4Parser.constid_return c1 = null;

        plp4Parser.constid_return c2 = null;

        plp4Parser.tiposimple_return tiposimple15 = null;



        		retval.eixida = "";
        		String aux = "";
        		int numSimbolo = 0;
        	
        try {
            // plp4.g:439:3: ( CONST tiposimple c1= constid ( COMA c2= constid )* PYC )
            // plp4.g:440:2: CONST tiposimple c1= constid ( COMA c2= constid )* PYC
            {
            match(input,CONST,FOLLOW_CONST_in_constdecl239); 
            pushFollow(FOLLOW_tiposimple_in_constdecl243);
            tiposimple15=tiposimple();

            state._fsp--;


            pushFollow(FOLLOW_constid_in_constdecl251);
            c1=constid();

            state._fsp--;


            		aux = (tiposimple15!=null?tiposimple15.locals:null)+",";
            		retval.eixida += (c1!=null?c1.eixida:null);
            		if((tiposimple15!=null?tiposimple15.tipo:null)==Simbolo.TipoRetorno.BOOLEANO && (c1!=null?c1.tipo:null)!=Simbolo.TipoRetorno.BOOLEANO){
            			ErrorSem6((c1!=null?c1.asigFila:0),(c1!=null?c1.asigColumna:0),(c1!=null?c1.asigText:null));
            		} else if ((tiposimple15!=null?tiposimple15.tipo:null)!=Simbolo.TipoRetorno.BOOLEANO && (c1!=null?c1.tipo:null)==Simbolo.TipoRetorno.BOOLEANO){
            			ErrorSem6((c1!=null?c1.asigFila:0),(c1!=null?c1.asigColumna:0),(c1!=null?c1.asigText:null));
            		} else if ((tiposimple15!=null?tiposimple15.tipo:null)==Simbolo.TipoRetorno.REAL && (c1!=null?c1.tipo:null)==Simbolo.TipoRetorno.ENTERO){
            			retval.eixida += "conv.r8 \n";
            		} else if ((tiposimple15!=null?tiposimple15.tipo:null)==Simbolo.TipoRetorno.ENTERO && (c1!=null?c1.tipo:null)==Simbolo.TipoRetorno.REAL){
            			retval.eixida += "conv.i4 \n";
            		}
            		
            		numSimbolo = tSimbolos.nuevo((c1!=null?c1.nombre:null),(tiposimple15!=null?tiposimple15.tipo:null),Simbolo.ClaseDato.CONSTANTE);
            		if(numSimbolo<0){
            			ErrorSem1(fila,columna,error);
            		}
            		retval.eixida += "stloc " + Integer.valueOf(tSimbolos.busca((c1!=null?c1.nombre:null)).num).toString() + "\n";	
            		
            	
            // plp4.g:463:2: ( COMA c2= constid )*
            loop7:
            do {
                int alt7=2;
                int LA7_0 = input.LA(1);

                if ( (LA7_0==COMA) ) {
                    alt7=1;
                }


                switch (alt7) {
            	case 1 :
            	    // plp4.g:463:3: COMA c2= constid
            	    {
            	    match(input,COMA,FOLLOW_COMA_in_constdecl259); 
            	    pushFollow(FOLLOW_constid_in_constdecl266);
            	    c2=constid();

            	    state._fsp--;


            	    	
            	    		if((tiposimple15!=null?tiposimple15.tipo:null)==Simbolo.TipoRetorno.BOOLEANO && (c2!=null?c2.tipo:null)!=Simbolo.TipoRetorno.BOOLEANO){
            	    			ErrorSem6((c2!=null?c2.asigFila:0),(c2!=null?c2.asigColumna:0),(c2!=null?c2.asigText:null));
            	    		} else if ((tiposimple15!=null?tiposimple15.tipo:null)!=Simbolo.TipoRetorno.BOOLEANO && (c2!=null?c2.tipo:null)==Simbolo.TipoRetorno.BOOLEANO){
            	    			ErrorSem6((c2!=null?c2.asigFila:0),(c2!=null?c2.asigColumna:0),(c2!=null?c2.asigText:null));
            	    		} else if ((tiposimple15!=null?tiposimple15.tipo:null)==Simbolo.TipoRetorno.REAL && (c2!=null?c2.tipo:null)==Simbolo.TipoRetorno.ENTERO){
            	    			retval.eixida += "conv.r8 //MAGNESIO \n";
            	    		} else if ((tiposimple15!=null?tiposimple15.tipo:null)==Simbolo.TipoRetorno.ENTERO && (c2!=null?c2.tipo:null)==Simbolo.TipoRetorno.REAL){
            	    			retval.eixida += "conv.i4 //ESTRONCIO\n";
            	    		}
            	    		retval.eixida += (c2!=null?c2.eixida:null);
            	    		aux+= (tiposimple15!=null?tiposimple15.locals:null)+",";
            	    		numSimbolo = tSimbolos.nuevo((c2!=null?c2.nombre:null),(tiposimple15!=null?tiposimple15.tipo:null),Simbolo.ClaseDato.CONSTANTE);
            	    		if(numSimbolo<0){
            	    			ErrorSem1(fila,columna,error+"CCC");
            	    		}
            	    		retval.eixida += "stloc " + Integer.valueOf(tSimbolos.busca((c2!=null?c2.nombre:null)).num).toString() + "\n";	
            	    		//retval.eixida += "stloc " + Integer.valueOf(numSimbolo).toString() + "\n";	
            	    	

            	    }
            	    break;

            	default :
            	    break loop7;
                }
            } while (true);

            match(input,PYC,FOLLOW_PYC_in_constdecl275); 

            		retval.locals = aux;
            	

            }

            retval.stop = input.LT(-1);

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return retval;
    }
    // $ANTLR end "constdecl"

    public static class constid_return extends ParserRuleReturnScope {
        public String eixida;
        public String nombre;
        public int asigFila;
        public int asigColumna;
        public String  asigText;
        public Simbolo.TipoRetorno tipo;
    };

    // $ANTLR start "constid"
    // plp4.g:490:1: constid returns [String eixida, String nombre, int asigFila, int asigColumna,String asigText, Simbolo.TipoRetorno tipo] : ID ASIG ( ENTERO | REAL | BOOLEANO ) ;
    public final plp4Parser.constid_return constid() throws RecognitionException {
        plp4Parser.constid_return retval = new plp4Parser.constid_return();
        retval.start = input.LT(1);

        Token ID16=null;
        Token ASIG17=null;
        Token ENTERO18=null;
        Token REAL19=null;
        Token BOOLEANO20=null;


        		retval.eixida = "";
        	
        try {
            // plp4.g:493:3: ( ID ASIG ( ENTERO | REAL | BOOLEANO ) )
            // plp4.g:494:2: ID ASIG ( ENTERO | REAL | BOOLEANO )
            {
            ID16=(Token)match(input,ID,FOLLOW_ID_in_constid297); 

            		retval.nombre = (ID16!=null?ID16.getText():null);
            		fila = (ID16!=null?ID16.getLine():0);
            		columna = (ID16!=null?ID16.getCharPositionInLine():0);
            		error = (ID16!=null?ID16.getText():null);
            		
            	
            ASIG17=(Token)match(input,ASIG,FOLLOW_ASIG_in_constid300); 

            		retval.asigFila = (ASIG17!=null?ASIG17.getLine():0);
            		retval.asigColumna = (ASIG17!=null?ASIG17.getCharPositionInLine():0);
            		retval.asigText = (ASIG17!=null?ASIG17.getText():null);
            		
            	
            // plp4.g:505:4: ( ENTERO | REAL | BOOLEANO )
            int alt8=3;
            switch ( input.LA(1) ) {
            case ENTERO:
                {
                alt8=1;
                }
                break;
            case REAL:
                {
                alt8=2;
                }
                break;
            case BOOLEANO:
                {
                alt8=3;
                }
                break;
            default:
                NoViableAltException nvae =
                    new NoViableAltException("", 8, 0, input);

                throw nvae;
            }

            switch (alt8) {
                case 1 :
                    // plp4.g:506:3: ENTERO
                    {
                    ENTERO18=(Token)match(input,ENTERO,FOLLOW_ENTERO_in_constid307); 

                    			retval.eixida = "ldc.i4 " + Integer.valueOf((ENTERO18!=null?ENTERO18.getText():null)).toString() + "\n";
                    			retval.tipo = Simbolo.TipoRetorno.ENTERO;
                    		
                    		

                    }
                    break;
                case 2 :
                    // plp4.g:510:7: REAL
                    {
                    REAL19=(Token)match(input,REAL,FOLLOW_REAL_in_constid312); 

                    		
                    			retval.eixida = "ldc.r8 " + Double.valueOf((REAL19!=null?REAL19.getText():null)).toString() + "\n";
                    			retval.tipo = Simbolo.TipoRetorno.REAL;
                    		
                    		

                    }
                    break;
                case 3 :
                    // plp4.g:515:7: BOOLEANO
                    {
                    BOOLEANO20=(Token)match(input,BOOLEANO,FOLLOW_BOOLEANO_in_constid317); 

                    			retval.tipo = Simbolo.TipoRetorno.BOOLEANO;
                    			if((BOOLEANO20!=null?BOOLEANO20.getText():null).equals("True")){
                    				retval.eixida = "ldc.i4 1\n";
                    			} else {
                    				retval.eixida = "ldc.i4 0\n";				
                    			}
                    		

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return retval;
    }
    // $ANTLR end "constid"

    public static class vardecl_return extends ParserRuleReturnScope {
        public String locals;
        public ArrayList<Simbolo> simbolos;
    };

    // $ANTLR start "vardecl"
    // plp4.g:526:1: vardecl returns [String locals, ArrayList<Simbolo> simbolos ] : tipo v1= varid ( COMA v2= varid )* PYC ;
    public final plp4Parser.vardecl_return vardecl() throws RecognitionException {
        plp4Parser.vardecl_return retval = new plp4Parser.vardecl_return();
        retval.start = input.LT(1);

        plp4Parser.varid_return v1 = null;

        plp4Parser.varid_return v2 = null;

        plp4Parser.tipo_return tipo21 = null;




        		String aux = "";
        		int auxx;
        		retval.simbolos = new ArrayList<Simbolo>();
        		
        	
        try {
            // plp4.g:533:3: ( tipo v1= varid ( COMA v2= varid )* PYC )
            // plp4.g:534:2: tipo v1= varid ( COMA v2= varid )* PYC
            {
            pushFollow(FOLLOW_tipo_in_vardecl342);
            tipo21=tipo();

            state._fsp--;


            		aux = (tipo21!=null?tipo21.locals:null);	
            	
            pushFollow(FOLLOW_varid_in_vardecl352);
            v1=varid();

            state._fsp--;


            		if(v1.esVector){
            			auxx= tSimbolos.nuevo((v1!=null?v1.nombre:null),(tipo21!=null?tipo21.tipo:null),(v1!=null?v1.dims:0));
            			aux+= "[],";
            			if(auxx<0){
            				ErrorSem1(fila,columna,error);
            			}
            		} else {
            			aux+=",";
            			auxx = tSimbolos.nuevo((v1!=null?v1.nombre:null),(tipo21!=null?tipo21.tipo:null),Simbolo.ClaseDato.VARIABLE);	
            			if(auxx<0){
            				ErrorSem1(fila,columna,error);
            			}
            		}
            		retval.simbolos.add(tSimbolos.busca((v1!=null?v1.nombre:null)));
            	
            	
            // plp4.g:554:2: ( COMA v2= varid )*
            loop9:
            do {
                int alt9=2;
                int LA9_0 = input.LA(1);

                if ( (LA9_0==COMA) ) {
                    alt9=1;
                }


                switch (alt9) {
            	case 1 :
            	    // plp4.g:554:3: COMA v2= varid
            	    {
            	    match(input,COMA,FOLLOW_COMA_in_vardecl358); 
            	    pushFollow(FOLLOW_varid_in_vardecl365);
            	    v2=varid();

            	    state._fsp--;


            	    		aux += (tipo21!=null?tipo21.locals:null);
            	    		if(v2.esVector){
            	    			auxx = tSimbolos.nuevo((v2!=null?v2.nombre:null),(tipo21!=null?tipo21.tipo:null),(v2!=null?v2.dims:0));
            	    			aux+= "[],";
            	    			if(auxx<0){
            	    				ErrorSem1(fila,columna,error);
            	    			}
            	    		} else {
            	    			aux+=",";
            	    			auxx = tSimbolos.nuevo((v2!=null?v2.nombre:null),(tipo21!=null?tipo21.tipo:null),Simbolo.ClaseDato.VARIABLE);	
            	    			if(auxx<0){
            	    				ErrorSem1(fila,columna,error);
            	    			}
            	    		}
            	    		retval.simbolos.add(tSimbolos.busca((v2!=null?v2.nombre:null)));
            	    	

            	    }
            	    break;

            	default :
            	    break loop9;
                }
            } while (true);

            match(input,PYC,FOLLOW_PYC_in_vardecl374); 

            		retval.locals = aux;
            	

            }

            retval.stop = input.LT(-1);

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return retval;
    }
    // $ANTLR end "vardecl"

    public static class varid_return extends ParserRuleReturnScope {
        public String nombre;
        public boolean esVector;
        public int dims;
    };

    // $ANTLR start "varid"
    // plp4.g:578:1: varid returns [String nombre, boolean esVector, int dims] : ID ( CORI ( COMA )* CORD )? ;
    public final plp4Parser.varid_return varid() throws RecognitionException {
        plp4Parser.varid_return retval = new plp4Parser.varid_return();
        retval.start = input.LT(1);

        Token ID22=null;


        		int contElementos=0;
        		retval.nombre = "";
        		retval.dims = 0;
        		retval.esVector = false;
        	
        try {
            // plp4.g:584:3: ( ID ( CORI ( COMA )* CORD )? )
            // plp4.g:585:2: ID ( CORI ( COMA )* CORD )?
            {
            ID22=(Token)match(input,ID,FOLLOW_ID_in_varid395); 

            		retval.nombre = (ID22!=null?ID22.getText():null);
            		error = (ID22!=null?ID22.getText():null);
            		fila = (ID22!=null?ID22.getLine():0);
            		columna = (ID22!=null?ID22.getCharPositionInLine():0);
            	
            // plp4.g:591:2: ( CORI ( COMA )* CORD )?
            int alt11=2;
            int LA11_0 = input.LA(1);

            if ( (LA11_0==CORI) ) {
                alt11=1;
            }
            switch (alt11) {
                case 1 :
                    // plp4.g:591:3: CORI ( COMA )* CORD
                    {
                    match(input,CORI,FOLLOW_CORI_in_varid400); 

                    		retval.dims++;
                    		retval.esVector =true;
                    	
                    // plp4.g:596:2: ( COMA )*
                    loop10:
                    do {
                        int alt10=2;
                        int LA10_0 = input.LA(1);

                        if ( (LA10_0==COMA) ) {
                            alt10=1;
                        }


                        switch (alt10) {
                    	case 1 :
                    	    // plp4.g:596:3: COMA
                    	    {
                    	    match(input,COMA,FOLLOW_COMA_in_varid407); 

                    	    		retval.dims++;
                    	    	

                    	    }
                    	    break;

                    	default :
                    	    break loop10;
                        }
                    } while (true);

                    match(input,CORD,FOLLOW_CORD_in_varid418); 

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return retval;
    }
    // $ANTLR end "varid"

    public static class instr_return extends ParserRuleReturnScope {
        public String eixida;
        public String locals;
    };

    // $ANTLR start "instr"
    // plp4.g:604:1: instr[boolean abreTabla] returns [String eixida, String locals] : ( bloque[$abreTabla] | fifi= IF PARI expr PARD i1= instr[true] ( ELSE i2= instr[true] )? | WHILE PARI expr PARD i3= instr[true] | FOR PARI INT ID ASIG e1= expr TO e2= expr STEP ( ADDOP )? ENTERO PARD i5= instr[false] | BREAK PYC | CONTINUE PYC | ref[true] cambio[$ref.error15] | ID ASIG NEW tiposimple CORI dims[s] CORD PYC | WRITELINE PARI expr PARD PYC | TRY bloque[true] bloquecatch | THROW ( NEW EXCEPTION PARI expr PARD )? PYC | EXPLAIN ID PYC | RETURN expr PYC | ID ASIG NEW ID PARI params[null] PARD PYC | subref[false] PARI params[null] PARD PYC );
    public final plp4Parser.instr_return instr(boolean abreTabla) throws RecognitionException {
        plp4Parser.instr_return retval = new plp4Parser.instr_return();
        retval.start = input.LT(1);

        Token fifi=null;
        Token WHILE26=null;
        Token ID27=null;
        Token TO28=null;
        Token ADDOP29=null;
        Token ENTERO30=null;
        Token BREAK31=null;
        Token CONTINUE32=null;
        Token ID35=null;
        Token TRY39=null;
        Token THROW43=null;
        Token ID44=null;
        Token EXPLAIN45=null;
        plp4Parser.instr_return i1 = null;

        plp4Parser.instr_return i2 = null;

        plp4Parser.instr_return i3 = null;

        plp4Parser.expr_return e1 = null;

        plp4Parser.expr_return e2 = null;

        plp4Parser.instr_return i5 = null;

        plp4Parser.bloque_return bloque23 = null;

        plp4Parser.expr_return expr24 = null;

        plp4Parser.expr_return expr25 = null;

        plp4Parser.ref_return ref33 = null;

        plp4Parser.cambio_return cambio34 = null;

        plp4Parser.tiposimple_return tiposimple36 = null;

        int dims37 = 0;

        plp4Parser.expr_return expr38 = null;

        plp4Parser.bloque_return bloque40 = null;

        String bloquecatch41 = null;

        plp4Parser.expr_return expr42 = null;



        		int etSalto1, etSalto2, etSalto3, etSalto4;
        		Simbolo simbaux= null;
        		retval.eixida ="";
        		int numSimbolo,numSimbolo2;
        		boolean addop = false;
        		Simbolo s;
        		Simbolo.TipoRetorno ttp;
        		retval.locals ="";
        	
        try {
            // plp4.g:614:3: ( bloque[$abreTabla] | fifi= IF PARI expr PARD i1= instr[true] ( ELSE i2= instr[true] )? | WHILE PARI expr PARD i3= instr[true] | FOR PARI INT ID ASIG e1= expr TO e2= expr STEP ( ADDOP )? ENTERO PARD i5= instr[false] | BREAK PYC | CONTINUE PYC | ref[true] cambio[$ref.error15] | ID ASIG NEW tiposimple CORI dims[s] CORD PYC | WRITELINE PARI expr PARD PYC | TRY bloque[true] bloquecatch | THROW ( NEW EXCEPTION PARI expr PARD )? PYC | EXPLAIN ID PYC | RETURN expr PYC | ID ASIG NEW ID PARI params[null] PARD PYC | subref[false] PARI params[null] PARD PYC )
            int alt15=15;
            alt15 = dfa15.predict(input);
            switch (alt15) {
                case 1 :
                    // plp4.g:615:2: bloque[$abreTabla]
                    {
                    pushFollow(FOLLOW_bloque_in_instr440);
                    bloque23=bloque(abreTabla);

                    state._fsp--;


                    		retval.eixida += (bloque23!=null?bloque23.eixida:null);
                    		retval.locals += (bloque23!=null?bloque23.locals:null);
                    	

                    }
                    break;
                case 2 :
                    // plp4.g:620:2: fifi= IF PARI expr PARD i1= instr[true] ( ELSE i2= instr[true] )?
                    {
                    fifi=(Token)match(input,IF,FOLLOW_IF_in_instr452); 
                    match(input,PARI,FOLLOW_PARI_in_instr454); 
                    pushFollow(FOLLOW_expr_in_instr457);
                    expr24=expr();

                    state._fsp--;


                    		if((expr24!=null?expr24.tipo:null)!=Simbolo.TipoRetorno.BOOLEANO){
                    			ErrorSem5((fifi!=null?fifi.getLine():0),(fifi!=null?fifi.getCharPositionInLine():0),(fifi!=null?fifi.getText():null));
                    		}
                    		etSalto1 = TSimbolos.saltos++;
                    		etSalto2 = TSimbolos.saltos++;
                    		etSalto3 = TSimbolos.saltos++;
                    		
                    		retval.eixida += "//x IF () \n" +(expr24!=null?expr24.eixida:null);
                    		retval.eixida += "ldc.i4 0\n";
                    		retval.eixida += "bne.un L" + etSalto1 +"\n";
                    		retval.eixida += "br L" + etSalto2 +"\n";
                    		retval.eixida += "//IF(x)\n";
                    	
                    match(input,PARD,FOLLOW_PARD_in_instr461); 
                    pushFollow(FOLLOW_instr_in_instr467);
                    i1=instr(true);

                    state._fsp--;


                    		retval.eixida +="L" + etSalto1 +":\n";
                    		retval.eixida +=(i1!=null?i1.eixida:null);
                    		retval.eixida +="br L" + (etSalto3)+"\n";
                    		retval.eixida +="//IF(){x}\n";
                    		retval.eixida +="L" + (etSalto2) +":\n";
                    		retval.locals += (i1!=null?i1.locals:null);
                    	
                    // plp4.g:645:2: ( ELSE i2= instr[true] )?
                    int alt12=2;
                    int LA12_0 = input.LA(1);

                    if ( (LA12_0==ELSE) ) {
                        alt12=1;
                    }
                    switch (alt12) {
                        case 1 :
                            // plp4.g:645:3: ELSE i2= instr[true]
                            {
                            match(input,ELSE,FOLLOW_ELSE_in_instr475); 
                            pushFollow(FOLLOW_instr_in_instr479);
                            i2=instr(true);

                            state._fsp--;


                            		
                            		retval.eixida += (i2!=null?i2.eixida:null);
                            		retval.locals += (i2!=null?i2.locals:null);
                            	

                            }
                            break;

                    }


                    		retval.eixida += "L" + (etSalto3) +":\n";
                    		retval.eixida+="//IF(){}x\n";
                    	

                    }
                    break;
                case 3 :
                    // plp4.g:655:2: WHILE PARI expr PARD i3= instr[true]
                    {
                    WHILE26=(Token)match(input,WHILE,FOLLOW_WHILE_in_instr492); 
                    match(input,PARI,FOLLOW_PARI_in_instr494); 

                    		etSalto1 = TSimbolos.saltos++;
                    		etSalto2 = TSimbolos.saltos++;
                    		etSalto3 = TSimbolos.saltos++;
                    		retval.eixida +="L" + etSalto1 +":\n";
                    		TSimbolos.apila("br L" + etSalto1 +"//while A \n","br L" + etSalto3 +"//while B \n");
                    	
                    pushFollow(FOLLOW_expr_in_instr500);
                    expr25=expr();

                    state._fsp--;


                    		if((expr25!=null?expr25.tipo:null)!=Simbolo.TipoRetorno.BOOLEANO){
                    			ErrorSem5((WHILE26!=null?WHILE26.getLine():0),(WHILE26!=null?WHILE26.getCharPositionInLine():0),(WHILE26!=null?WHILE26.getText():null));
                    		}
                    		retval.eixida += (expr25!=null?expr25.eixida:null);
                    		retval.eixida += "ldc.i4 0\n";
                    		retval.eixida += "bne.un L" + etSalto2 +"\n";
                    		retval.eixida += "br L" + etSalto3 +"//while C \n";
                    	
                    match(input,PARD,FOLLOW_PARD_in_instr506); 
                    pushFollow(FOLLOW_instr_in_instr512);
                    i3=instr(true);

                    state._fsp--;


                    		retval.eixida +="L" + etSalto2 +":\n";
                    		retval.eixida += (i3!=null?i3.eixida:null);
                    		retval.eixida += "br L" + etSalto1 +"//while D \n";
                    		retval.eixida +="L" + etSalto3 +":\n";
                    		TSimbolos.desapila();
                    		retval.locals+= (i3!=null?i3.locals:null);
                    	

                    }
                    break;
                case 4 :
                    // plp4.g:684:2: FOR PARI INT ID ASIG e1= expr TO e2= expr STEP ( ADDOP )? ENTERO PARD i5= instr[false]
                    {
                    match(input,FOR,FOLLOW_FOR_in_instr523); 
                    match(input,PARI,FOLLOW_PARI_in_instr525); 

                    	
                    	 	tSimbolos = new TSimbolos(tSimbolos,null);	
                    	 	etSalto1 = TSimbolos.saltos++;
                    		etSalto2 = TSimbolos.saltos++;
                    		etSalto3 = TSimbolos.saltos++;
                    		etSalto4 = TSimbolos.saltos++;
                    		TSimbolos.apila("br L" + Integer.valueOf(etSalto4).toString() +"//FOR A \n","br L" + Integer.valueOf(etSalto3).toString() +"//FOR B \n");
                    		
                    		
                    	
                    match(input,INT,FOLLOW_INT_in_instr530); 
                    ID27=(Token)match(input,ID,FOLLOW_ID_in_instr532); 
                    match(input,ASIG,FOLLOW_ASIG_in_instr534); 

                    	 	
                    		numSimbolo = tSimbolos.nuevo((ID27!=null?ID27.getText():null),Simbolo.TipoRetorno.ENTERO,Simbolo.ClaseDato.CONSTANTE);
                    		retval.locals+= "int32,";
                    		
                    	
                    pushFollow(FOLLOW_expr_in_instr541);
                    e1=expr();

                    state._fsp--;


                    		/*if((e1!=null?e1.tipo:null)==Simbolo.TipoRetorno.BOOLEANO){
                    			ErrorSem17((ID27!=null?ID27.getLine():0),(ID27!=null?ID27.getCharPositionInLine():0),(ID27!=null?ID27.getText():null));
                    		}*/
                    		retval.eixida = (e1!=null?e1.eixida:null);
                    		if((e1!=null?e1.tipo:null) == Simbolo.TipoRetorno.REAL){
                    			retval.eixida += "conv.i4\n";	
                    		} 
                    		retval.eixida += "stloc " + Integer.valueOf(numSimbolo).toString() + "\n"; 
                    	
                    TO28=(Token)match(input,TO,FOLLOW_TO_in_instr545); 
                    pushFollow(FOLLOW_expr_in_instr550);
                    e2=expr();

                    state._fsp--;


                    		retval.eixida += (e2!=null?e2.eixida:null);	
                    		if((e2!=null?e2.tipo:null)==Simbolo.TipoRetorno.REAL){
                    			retval.eixida+= "conv.i4 //RADIO\n";
                    		} else if((e2!=null?e2.tipo:null)==Simbolo.TipoRetorno.BOOLEANO){
                    			ErrorSem17((TO28!=null?TO28.getLine():0),(TO28!=null?TO28.getCharPositionInLine():0),(TO28!=null?TO28.getText():null));
                    		}
                    		numSimbolo2 = tSimbolos.nuevo((TO28!=null?TO28.getText():null),Simbolo.TipoRetorno.ENTERO,Simbolo.ClaseDato.CONSTANTE);
                    		retval.locals+= "int32,";
                    		retval.eixida += "stloc " + numSimbolo2 + "\n";
                    		retval.eixida += "ldloc " + numSimbolo + " //16MEGAPIXEL\n";
                    		retval.eixida +="L" + etSalto1 +": //INTERDEMILAN \n";
                    		retval.eixida += "ldloc "+ numSimbolo2 +" //17MEGAPIXEL\n";
                    	
                    match(input,STEP,FOLLOW_STEP_in_instr555); 
                    // plp4.g:725:7: ( ADDOP )?
                    int alt13=2;
                    int LA13_0 = input.LA(1);

                    if ( (LA13_0==ADDOP) ) {
                        alt13=1;
                    }
                    switch (alt13) {
                        case 1 :
                            // plp4.g:725:8: ADDOP
                            {
                            ADDOP29=(Token)match(input,ADDOP,FOLLOW_ADDOP_in_instr558); 

                            		addop = true;
                            	

                            }
                            break;

                    }

                    ENTERO30=(Token)match(input,ENTERO,FOLLOW_ENTERO_in_instr563); 
                    match(input,PARD,FOLLOW_PARD_in_instr565); 

                    		
                    		if(addop && (ADDOP29!=null?ADDOP29.getText():null).equals("-")){
                    			retval.eixida += "bge L" + etSalto2 + "\n";
                    		} else {
                    			retval.eixida += "ble L" + etSalto2 + "\n";
                    		}

                    		retval.eixida += "br L" + etSalto3 +"//FOR c \n";
                    	
                    pushFollow(FOLLOW_instr_in_instr571);
                    i5=instr(false);

                    state._fsp--;


                    		retval.eixida +="L" + etSalto2 +":\n";
                    		retval.eixida += (i5!=null?i5.eixida:null);
                    		retval.eixida +="L" + etSalto4 +":\n";
                    		retval.eixida += "ldloc " + Integer.valueOf(numSimbolo).toString() + "\n";
                    		retval.eixida += "ldc.i4 " + (ENTERO30!=null?ENTERO30.getText():null) + "\n //En honor a Marta \n";
                    		if(addop && (ADDOP29!=null?ADDOP29.getText():null).equals("-")){
                    			retval.eixida += "sub\n";
                    		} else {
                    			retval.eixida += "add\n";
                    		}
                    		retval.eixida += "dup\n";
                    		retval.eixida += "stloc " + Integer.valueOf(numSimbolo).toString() + "\n";
                    		
                    		
                    		retval.eixida += "br L" + etSalto1 +"//FOR D \n";
                    		
                    		
                    		
                    		retval.eixida +="L" + etSalto3 +":\n";
                    		TSimbolos.desapila();
                    		tSimbolos = tSimbolos.pop();
                    		retval.locals+= (i5!=null?i5.locals:null);
                    	

                    }
                    break;
                case 5 :
                    // plp4.g:762:2: BREAK PYC
                    {
                    BREAK31=(Token)match(input,BREAK,FOLLOW_BREAK_in_instr579); 
                    match(input,PYC,FOLLOW_PYC_in_instr581); 

                    		if(TSimbolos.isVacia()){
                    			ErrorSem16((BREAK31!=null?BREAK31.getLine():0), (BREAK31!=null?BREAK31.getCharPositionInLine():0), (BREAK31!=null?BREAK31.getText():null));
                    		} else {
                    			retval.eixida+= TSimbolos.desapilaSuave()[1];	
                    		}
                    	

                    }
                    break;
                case 6 :
                    // plp4.g:770:2: CONTINUE PYC
                    {
                    CONTINUE32=(Token)match(input,CONTINUE,FOLLOW_CONTINUE_in_instr588); 
                    match(input,PYC,FOLLOW_PYC_in_instr590); 
                    	
                    		if(TSimbolos.isVacia()){
                    			ErrorSem16((CONTINUE32!=null?CONTINUE32.getLine():0), (CONTINUE32!=null?CONTINUE32.getCharPositionInLine():0), (CONTINUE32!=null?CONTINUE32.getText():null));	
                    		} else {
                    			retval.eixida+= TSimbolos.desapilaSuave()[0];	
                    		}
                    	
                    	

                    }
                    break;
                case 7 :
                    // plp4.g:779:2: ref[true] cambio[$ref.error15]
                    {
                    pushFollow(FOLLOW_ref_in_instr597);
                    ref33=ref(true);

                    state._fsp--;



                    	
                    pushFollow(FOLLOW_cambio_in_instr601);
                    cambio34=cambio((ref33!=null?ref33.error15:false));

                    state._fsp--;

                    	
                    		
                    		if(error.equals("readline")){
                    			if((ref33!=null?ref33.tipo:null)!=(cambio34!=null?cambio34.tipo:null)){
                    				ErrorSem7((cambio34!=null?cambio34.asL:0),(cambio34!=null?cambio34.asC:0),error);
                    			}
                    		
                    		}
                    		if((ref33!=null?ref33.tipo:null)==Simbolo.TipoRetorno.BOOLEANO && (cambio34!=null?cambio34.tipo:null)!=Simbolo.TipoRetorno.BOOLEANO 
                    			|| (ref33!=null?ref33.tipo:null)!=Simbolo.TipoRetorno.BOOLEANO && (cambio34!=null?cambio34.tipo:null)== Simbolo.TipoRetorno.BOOLEANO){
                    				ErrorSem6((cambio34!=null?cambio34.asL:0),(cambio34!=null?cambio34.asC:0),error);
                    			}
                    		
                    		if(!(cambio34!=null?cambio34.vector:false) && !(ref33!=null?ref33.vector:false)){
                    			retval.eixida += (cambio34!=null?cambio34.eixida:null);
                    				if((ref33!=null?ref33.tipo:null) == Simbolo.TipoRetorno.ENTERO && (cambio34!=null?cambio34.tipo:null) == Simbolo.TipoRetorno.REAL){
                    					retval.eixida += "conv.i4 //CROMO\n";
                    				} else if((ref33!=null?ref33.tipo:null) == Simbolo.TipoRetorno.REAL && (cambio34!=null?cambio34.tipo:null) == Simbolo.TipoRetorno.ENTERO){
                    					 retval.eixida += "conv.r8 //HIDROGENO\n";
                    				}
                    			retval.eixida += (ref33!=null?ref33.eixida:null);
                    			retval.eixida += (ref33!=null?ref33.eixida2:null);
                    		} else {
                    			retval.eixida += (ref33!=null?ref33.eixida:null);
                    			retval.eixida += (cambio34!=null?cambio34.eixida:null);
                    				if((ref33!=null?ref33.tipo:null) == Simbolo.TipoRetorno.ENTERO && (cambio34!=null?cambio34.tipo:null) == Simbolo.TipoRetorno.REAL){
                    					retval.eixida += "conv.i4 //CROMO\n";
                    				} else if((ref33!=null?ref33.tipo:null) == Simbolo.TipoRetorno.REAL && (cambio34!=null?cambio34.tipo:null) == Simbolo.TipoRetorno.ENTERO){
                    					retval.eixida += "conv.r8 //HIDROGENO\n";
                    				}
                    			retval.eixida += (ref33!=null?ref33.eixida2:null);
                    		}
                    		
                    		
                    	

                    }
                    break;
                case 8 :
                    // plp4.g:818:2: ID ASIG NEW tiposimple CORI dims[s] CORD PYC
                    {
                    ID35=(Token)match(input,ID,FOLLOW_ID_in_instr612); 

                    		s = tSimbolos.busca((ID35!=null?ID35.getText():null));
                    		if(s==null){
                    			ErrorSem2((ID35!=null?ID35.getLine():0),(ID35!=null?ID35.getCharPositionInLine():0),(ID35!=null?ID35.getText():null));
                    		}
                    		
                    	
                    match(input,ASIG,FOLLOW_ASIG_in_instr618); 
                    match(input,NEW,FOLLOW_NEW_in_instr620); 
                    pushFollow(FOLLOW_tiposimple_in_instr622);
                    tiposimple36=tiposimple();

                    state._fsp--;


                    		if((tiposimple36!=null?tiposimple36.tipo:null) != s.retorno){
                    			ErrorSem14(fila,columna,error);
                    		}
                    		
                    	
                    match(input,CORI,FOLLOW_CORI_in_instr627); 
                    pushFollow(FOLLOW_dims_in_instr629);
                    dims37=dims(s);

                    state._fsp--;

                    match(input,CORD,FOLLOW_CORD_in_instr633); 

                    		retval.eixida += "ldc.i4 "+ dims37 + "\n";
                    		retval.eixida += "newarr[mscorlib] System.";
                    		if(s.retorno==Simbolo.TipoRetorno.REAL){
                    			retval.eixida+="Double\n";
                    		} else {
                    			retval.eixida+="Int32\n";
                    		}
                    		retval.eixida += "stloc "+ String.valueOf(s.num)+"\n";
                    	
                    match(input,PYC,FOLLOW_PYC_in_instr639); 

                    }
                    break;
                case 9 :
                    // plp4.g:846:2: WRITELINE PARI expr PARD PYC
                    {
                    match(input,WRITELINE,FOLLOW_WRITELINE_in_instr645); 
                    match(input,PARI,FOLLOW_PARI_in_instr647); 
                    pushFollow(FOLLOW_expr_in_instr650);
                    expr38=expr();

                    state._fsp--;


                    		retval.eixida+= (expr38!=null?expr38.eixida:null);
                    		retval.eixida+= "call void [mscorlib]System.Console::WriteLine(";
                    		if((expr38!=null?expr38.tipo:null)==(Simbolo.TipoRetorno.ENTERO)) retval.eixida+= "int32)\n";
                    		else if((expr38!=null?expr38.tipo:null)==(Simbolo.TipoRetorno.REAL)) retval.eixida+= "float64)\n";
                    		else if((expr38!=null?expr38.tipo:null)==(Simbolo.TipoRetorno.BOOLEANO)) retval.eixida+="bool)\n";
                    	
                    match(input,PARD,FOLLOW_PARD_in_instr655); 
                    match(input,PYC,FOLLOW_PYC_in_instr657); 

                    }
                    break;
                case 10 :
                    // plp4.g:856:2: TRY bloque[true] bloquecatch
                    {
                    TRY39=(Token)match(input,TRY,FOLLOW_TRY_in_instr663); 

                    		retval.eixida += ".try\n{";
                    		if(enCatch){
                    			ErrorSem18((TRY39!=null?TRY39.getLine():0),(TRY39!=null?TRY39.getCharPositionInLine():0),(TRY39!=null?TRY39.getText():null));	
                    		}
                    	
                    pushFollow(FOLLOW_bloque_in_instr667);
                    bloque40=bloque(true);

                    state._fsp--;


                    		etSalto1 = TSimbolos.saltos++;
                    		retval.eixida += (bloque40!=null?bloque40.eixida:null);
                    		retval.locals+= (bloque40!=null?bloque40.locals:null);
                    		retval.eixida+= "leave L"+Integer.valueOf(etSalto1).toString()+"}\n";
                    	
                    pushFollow(FOLLOW_bloquecatch_in_instr672);
                    bloquecatch41=bloquecatch();

                    state._fsp--;


                    		retval.eixida+= bloquecatch41;
                    		retval.eixida += "leave L"+ Integer.valueOf(etSalto1).toString()+ "\n}\n";
                    		retval.eixida += "L"+Integer.valueOf(etSalto1).toString()+":\n";
                    	

                    }
                    break;
                case 11 :
                    // plp4.g:874:2: THROW ( NEW EXCEPTION PARI expr PARD )? PYC
                    {
                    THROW43=(Token)match(input,THROW,FOLLOW_THROW_in_instr679); 
                    // plp4.g:874:8: ( NEW EXCEPTION PARI expr PARD )?
                    int alt14=2;
                    int LA14_0 = input.LA(1);

                    if ( (LA14_0==NEW) ) {
                        alt14=1;
                    }
                    switch (alt14) {
                        case 1 :
                            // plp4.g:874:9: NEW EXCEPTION PARI expr PARD
                            {
                            match(input,NEW,FOLLOW_NEW_in_instr682); 
                            match(input,EXCEPTION,FOLLOW_EXCEPTION_in_instr684); 
                            match(input,PARI,FOLLOW_PARI_in_instr686); 
                            pushFollow(FOLLOW_expr_in_instr688);
                            expr42=expr();

                            state._fsp--;


                            		//addop es que ha entrado
                            		addop = true;
                            		retval.eixida = (expr42!=null?expr42.eixida:null);
                            		if((expr42!=null?expr42.tipo:null)==Simbolo.TipoRetorno.REAL){
                            			retval.eixida += "call string [mscorlib]System.Convert::ToString(float64)\n";
                            		} else {
                            			retval.eixida += "call string [mscorlib]System.Convert::ToString(int32)\n";
                            		}
                              		retval.eixida += "newobj instance void [mscorlib]System.Exception::.ctor(string)\n";
                              		retval.eixida += "throw\n";
                            	
                            match(input,PARD,FOLLOW_PARD_in_instr692); 

                            }
                            break;

                    }


                    		if(!addop && enCatch){
                    			retval.eixida += "rethrow\n";
                    		} else if (!addop){
                    			ErrorSem18((THROW43!=null?THROW43.getLine():0),(THROW43!=null?THROW43.getCharPositionInLine():0),(THROW43!=null?THROW43.getText():null));
                    		}
                    		
                    	
                    match(input,PYC,FOLLOW_PYC_in_instr699); 

                    }
                    break;
                case 12 :
                    // plp4.g:896:2: EXPLAIN ID PYC
                    {
                    EXPLAIN45=(Token)match(input,EXPLAIN,FOLLOW_EXPLAIN_in_instr705); 
                    ID44=(Token)match(input,ID,FOLLOW_ID_in_instr707); 

                    		if(enCatch){
                    			s = tSimbolos.busca((ID44!=null?ID44.getText():null));
                    			if(s.retorno!=Simbolo.TipoRetorno.EXCEPCION){
                    				ErrorSem19((ID44!=null?ID44.getLine():0),(ID44!=null?ID44.getCharPositionInLine():0),(ID44!=null?ID44.getText():null));
                    			}
                    			retval.eixida += "dup\n";
                      			retval.eixida += "call instance string [mscorlib]System.Exception::get_Message()\n";
                      			retval.eixida += "call void [mscorlib]System.Console::WriteLine(string)\n";
                    		} else {
                    		
                    			ErrorSem18((EXPLAIN45!=null?EXPLAIN45.getLine():0),(EXPLAIN45!=null?EXPLAIN45.getCharPositionInLine():0),(EXPLAIN45!=null?EXPLAIN45.getText():null));	
                    		}
                    		
                    	
                    match(input,PYC,FOLLOW_PYC_in_instr712); 

                    }
                    break;
                case 13 :
                    // plp4.g:912:2: RETURN expr PYC
                    {
                    match(input,RETURN,FOLLOW_RETURN_in_instr718); 
                    pushFollow(FOLLOW_expr_in_instr720);
                    expr();

                    state._fsp--;

                    match(input,PYC,FOLLOW_PYC_in_instr722); 

                    }
                    break;
                case 14 :
                    // plp4.g:914:2: ID ASIG NEW ID PARI params[null] PARD PYC
                    {
                    match(input,ID,FOLLOW_ID_in_instr729); 
                    match(input,ASIG,FOLLOW_ASIG_in_instr731); 
                    match(input,NEW,FOLLOW_NEW_in_instr733); 
                    match(input,ID,FOLLOW_ID_in_instr735); 
                    match(input,PARI,FOLLOW_PARI_in_instr737); 
                    pushFollow(FOLLOW_params_in_instr739);
                    params(null);

                    state._fsp--;

                    match(input,PARD,FOLLOW_PARD_in_instr742); 
                    match(input,PYC,FOLLOW_PYC_in_instr744); 

                    }
                    break;
                case 15 :
                    // plp4.g:916:2: subref[false] PARI params[null] PARD PYC
                    {
                    pushFollow(FOLLOW_subref_in_instr750);
                    subref(false);

                    state._fsp--;

                    match(input,PARI,FOLLOW_PARI_in_instr753); 
                    pushFollow(FOLLOW_params_in_instr755);
                    params(null);

                    state._fsp--;

                    match(input,PARD,FOLLOW_PARD_in_instr758); 
                    match(input,PYC,FOLLOW_PYC_in_instr760); 

                    }
                    break;

            }
            retval.stop = input.LT(-1);

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return retval;
    }
    // $ANTLR end "instr"

    public static class bloque_return extends ParserRuleReturnScope {
        public String eixida;
        public int tampila;
        public String locals;
    };

    // $ANTLR start "bloque"
    // plp4.g:923:1: bloque[boolean abreTabla] returns [String eixida, int tampila, String locals] : LLAVEI declins LLAVED ;
    public final plp4Parser.bloque_return bloque(boolean abreTabla) throws RecognitionException {
        plp4Parser.bloque_return retval = new plp4Parser.bloque_return();
        retval.start = input.LT(1);

        plp4Parser.declins_return declins46 = null;



        		retval.eixida = "";
        	
        try {
            // plp4.g:926:3: ( LLAVEI declins LLAVED )
            // plp4.g:927:2: LLAVEI declins LLAVED
            {
            match(input,LLAVEI,FOLLOW_LLAVEI_in_bloque786); 

            		if(abreTabla){
            			tSimbolos = new TSimbolos(tSimbolos,null);
            		}
            	
            pushFollow(FOLLOW_declins_in_bloque790);
            declins46=declins();

            state._fsp--;


            		retval.eixida += (declins46!=null?declins46.eixida:null);
            		retval.locals = (declins46!=null?declins46.locals:null);
            	
            match(input,LLAVED,FOLLOW_LLAVED_in_bloque795); 

            		if(abreTabla){
            			tSimbolos = tSimbolos.pop();
            		}
            		
            	

            }

            retval.stop = input.LT(-1);

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return retval;
    }
    // $ANTLR end "bloque"


    // $ANTLR start "bloquecatch"
    // plp4.g:944:1: bloquecatch returns [String eixida] : CATCH PARI EXCEPTION ID PARD bloque[true] ;
    public final String bloquecatch() throws RecognitionException {
        String eixida = null;

        Token ID47=null;
        plp4Parser.bloque_return bloque48 = null;



        		eixida = "";
        	
        try {
            // plp4.g:947:3: ( CATCH PARI EXCEPTION ID PARD bloque[true] )
            // plp4.g:947:4: CATCH PARI EXCEPTION ID PARD bloque[true]
            {

            		enCatch = true;
            	
            match(input,CATCH,FOLLOW_CATCH_in_bloquecatch818); 

            		eixida += "catch [mscorlib]System.Exception\n{\n";
            	
            	
            match(input,PARI,FOLLOW_PARI_in_bloquecatch821); 
            match(input,EXCEPTION,FOLLOW_EXCEPTION_in_bloquecatch823); 
            ID47=(Token)match(input,ID,FOLLOW_ID_in_bloquecatch825); 

            		tSimbolos.nuevo((ID47!=null?ID47.getText():null),Simbolo.TipoRetorno.EXCEPCION,Simbolo.ClaseDato.CONSTANTE);
            	
            match(input,PARD,FOLLOW_PARD_in_bloquecatch828); 
            pushFollow(FOLLOW_bloque_in_bloquecatch830);
            bloque48=bloque(true);

            state._fsp--;

             
            		eixida+=(bloque48!=null?bloque48.eixida:null);
            	

            		enCatch = false;
            	

            }

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return eixida;
    }
    // $ANTLR end "bloquecatch"

    public static class declins_return extends ParserRuleReturnScope {
        public String eixida;
        public String locals;
    };

    // $ANTLR start "declins"
    // plp4.g:961:1: declins returns [String eixida,String locals] : ( instr[true] | decl )* ;
    public final plp4Parser.declins_return declins() throws RecognitionException {
        plp4Parser.declins_return retval = new plp4Parser.declins_return();
        retval.start = input.LT(1);

        plp4Parser.instr_return instr49 = null;

        plp4Parser.decl_return decl50 = null;



        		retval.eixida = "";
        		retval.locals = " ";
        	
        try {
            // plp4.g:965:3: ( ( instr[true] | decl )* )
            // plp4.g:966:2: ( instr[true] | decl )*
            {
            // plp4.g:966:2: ( instr[true] | decl )*
            loop16:
            do {
                int alt16=3;
                switch ( input.LA(1) ) {
                case LLAVEI:
                case IF:
                case WHILE:
                case FOR:
                case BREAK:
                case CONTINUE:
                case WRITELINE:
                case TRY:
                case THROW:
                case EXPLAIN:
                case RETURN:
                    {
                    alt16=1;
                    }
                    break;
                case ID:
                    {
                    int LA16_3 = input.LA(2);

                    if ( (LA16_3==PARI||LA16_3==ASIG||LA16_3==CORI||LA16_3==PUNTO) ) {
                        alt16=1;
                    }
                    else if ( (LA16_3==ID) ) {
                        alt16=2;
                    }


                    }
                    break;
                case INT:
                case DOUBLE:
                case BOOL:
                case CONST:
                    {
                    alt16=2;
                    }
                    break;

                }

                switch (alt16) {
            	case 1 :
            	    // plp4.g:967:2: instr[true]
            	    {
            	    pushFollow(FOLLOW_instr_in_declins853);
            	    instr49=instr(true);

            	    state._fsp--;


            	    		retval.eixida += (instr49!=null?instr49.eixida:null);
            	    		retval.locals += (instr49!=null?instr49.locals:null);
            	    	

            	    }
            	    break;
            	case 2 :
            	    // plp4.g:972:2: decl
            	    {
            	    pushFollow(FOLLOW_decl_in_declins861);
            	    decl50=decl();

            	    state._fsp--;


            	    		retval.eixida += (decl50!=null?decl50.eixida:null);
            	    		retval.locals += (decl50!=null?decl50.locals:null);
            	    	

            	    }
            	    break;

            	default :
            	    break loop16;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return retval;
    }
    // $ANTLR end "declins"


    // $ANTLR start "dims"
    // plp4.g:979:1: dims[Simbolo s] returns [int tamArray] : e1= ENTERO ( COMA e2= ENTERO )* ;
    public final int dims(Simbolo s) throws RecognitionException {
        int tamArray = 0;

        Token e1=null;
        Token e2=null;
        Token COMA51=null;


        		tamArray =1; 
        		int cont =0;
        	
        try {
            // plp4.g:984:3: (e1= ENTERO ( COMA e2= ENTERO )* )
            // plp4.g:985:2: e1= ENTERO ( COMA e2= ENTERO )*
            {
            e1=(Token)match(input,ENTERO,FOLLOW_ENTERO_in_dims890); 

            		if(!(Integer.valueOf((e1!=null?e1.getText():null))>0)){
            			ErrorSem8((e1!=null?e1.getLine():0),(e1!=null?e1.getCharPositionInLine():0),(e1!=null?e1.getText():null));
            		}
            		if(cont<s.dims.size()){
            			s.dims.set(cont,Integer.valueOf((e1!=null?e1.getText():null)));
            			cont++;		
            		} else {
            			ErrorSem10(fila,columna,error);
            		}
            		tamArray*=Integer.valueOf((e1!=null?e1.getText():null));
            	
            // plp4.g:998:2: ( COMA e2= ENTERO )*
            loop17:
            do {
                int alt17=2;
                int LA17_0 = input.LA(1);

                if ( (LA17_0==COMA) ) {
                    alt17=1;
                }


                switch (alt17) {
            	case 1 :
            	    // plp4.g:998:3: COMA e2= ENTERO
            	    {
            	    COMA51=(Token)match(input,COMA,FOLLOW_COMA_in_dims897); 
            	    e2=(Token)match(input,ENTERO,FOLLOW_ENTERO_in_dims901); 

            	    		if(!(Integer.valueOf((e2!=null?e2.getText():null))>0)){
            	    			ErrorSem8((e2!=null?e2.getLine():0),(e2!=null?e2.getCharPositionInLine():0),(e2!=null?e2.getText():null));
            	    		}
            	    		if(cont<s.dims.size()){
            	    			s.dims.set(cont,Integer.valueOf((e2!=null?e2.getText():null)));
            	    			cont++;		
            	    		} else {
            	    			ErrorSem10((COMA51!=null?COMA51.getLine():0),(COMA51!=null?COMA51.getCharPositionInLine():0),(COMA51!=null?COMA51.getText():null));
            	    		}
            	    		tamArray*=Integer.valueOf((e2!=null?e2.getText():null));
            	    	

            	    }
            	    break;

            	default :
            	    break loop17;
                }
            } while (true);


            }

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return tamArray;
    }
    // $ANTLR end "dims"

    public static class cambio_return extends ParserRuleReturnScope {
        public String eixida;
        public Simbolo.TipoRetorno tipo;
        public int asL;
        public int asC;
        public boolean vector;
    };

    // $ANTLR start "cambio"
    // plp4.g:1014:1: cambio[boolean error15] returns [String eixida, Simbolo.TipoRetorno tipo, int asL, int asC, boolean vector] : ( ASIG expr PYC | PUNTO READLINE PYC );
    public final plp4Parser.cambio_return cambio(boolean error15) throws RecognitionException {
        plp4Parser.cambio_return retval = new plp4Parser.cambio_return();
        retval.start = input.LT(1);

        Token ASIG52=null;
        Token READLINE54=null;
        plp4Parser.expr_return expr53 = null;



        		retval.eixida = "";
        		retval.vector = false;
        	
        try {
            // plp4.g:1018:3: ( ASIG expr PYC | PUNTO READLINE PYC )
            int alt18=2;
            int LA18_0 = input.LA(1);

            if ( (LA18_0==ASIG) ) {
                alt18=1;
            }
            else if ( (LA18_0==PUNTO) ) {
                alt18=2;
            }
            else {
                NoViableAltException nvae =
                    new NoViableAltException("", 18, 0, input);

                throw nvae;
            }
            switch (alt18) {
                case 1 :
                    // plp4.g:1019:2: ASIG expr PYC
                    {
                    ASIG52=(Token)match(input,ASIG,FOLLOW_ASIG_in_cambio928); 
                    		
                    		fila = (ASIG52!=null?ASIG52.getLine():0);
                    		retval.asL = fila;
                    		columna = (ASIG52!=null?ASIG52.getCharPositionInLine():0);
                    		retval.asC =columna;
                    		error = (ASIG52!=null?ASIG52.getText():null);
                    		if(error15){
                    			ErrorSem15((ASIG52!=null?ASIG52.getLine():0),(ASIG52!=null?ASIG52.getCharPositionInLine():0),error);
                    		}
                    	
                    pushFollow(FOLLOW_expr_in_cambio932);
                    expr53=expr();

                    state._fsp--;


                    		retval.eixida += (expr53!=null?expr53.eixida:null);
                    		retval.tipo = (expr53!=null?expr53.tipo:null);
                    		retval.vector = (expr53!=null?expr53.vector:false);
                    	
                    match(input,PYC,FOLLOW_PYC_in_cambio936); 

                    	

                    }
                    break;
                case 2 :
                    // plp4.g:1037:2: PUNTO READLINE PYC
                    {
                    match(input,PUNTO,FOLLOW_PUNTO_in_cambio944); 
                    READLINE54=(Token)match(input,READLINE,FOLLOW_READLINE_in_cambio946); 

                    		retval.asL = (READLINE54!=null?READLINE54.getLine():0);
                    		retval.asC = (READLINE54!=null?READLINE54.getCharPositionInLine():0);
                    		error = "readline";
                    		if(error15){
                    			ErrorSem15((READLINE54!=null?READLINE54.getLine():0),(READLINE54!=null?READLINE54.getCharPositionInLine():0),error);
                    		}
                    	
                    match(input,PYC,FOLLOW_PYC_in_cambio949); 

                    	retval.eixida += "call string [mscorlib]System.Console::ReadLine()\n";
                    	if((READLINE54!=null?READLINE54.getText():null).contains("int")){
                    			retval.eixida += "call int32 [mscorlib]System.Int32::Parse(string)\n";
                    			retval.tipo = Simbolo.TipoRetorno.ENTERO;
                    	} else if((READLINE54!=null?READLINE54.getText():null).contains("double")){
                    			retval.eixida += "call float64 [mscorlib]System.Double::Parse(string)\n";
                    			retval.tipo = Simbolo.TipoRetorno.REAL;
                    	} else if((READLINE54!=null?READLINE54.getText():null).contains("bool")){
                    			retval.eixida += "call bool [mscorlib]System.Boolean::Parse(string)\n";
                    			retval.tipo = Simbolo.TipoRetorno.BOOLEANO;
                    	}

                    	

                    }
                    break;

            }
            retval.stop = input.LT(-1);

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return retval;
    }
    // $ANTLR end "cambio"

    public static class expr_return extends ParserRuleReturnScope {
        public String eixida;
        public Simbolo.TipoRetorno tipo;
        public boolean vector;
    };

    // $ANTLR start "expr"
    // plp4.g:1060:1: expr returns [String eixida, Simbolo.TipoRetorno tipo, boolean vector] : ea1= eand ( OR ea2= eand )* ;
    public final plp4Parser.expr_return expr() throws RecognitionException {
        plp4Parser.expr_return retval = new plp4Parser.expr_return();
        retval.start = input.LT(1);

        Token OR55=null;
        plp4Parser.eand_return ea1 = null;

        plp4Parser.eand_return ea2 = null;


        	
        		Simbolo.TipoRetorno tipo2;
        		retval.eixida ="";
        		retval.vector = false;
        	
        try {
            // plp4.g:1065:3: (ea1= eand ( OR ea2= eand )* )
            // plp4.g:1066:9: ea1= eand ( OR ea2= eand )*
            {
            pushFollow(FOLLOW_eand_in_expr978);
            ea1=eand();

            state._fsp--;



            		retval.tipo = (ea1!=null?ea1.tipo:null);
            		retval.eixida += (ea1!=null?ea1.eixida:null);
            		retval.vector = (ea1!=null?ea1.vector:false);
                    
            // plp4.g:1072:9: ( OR ea2= eand )*
            loop19:
            do {
                int alt19=2;
                int LA19_0 = input.LA(1);

                if ( (LA19_0==OR) ) {
                    alt19=1;
                }


                switch (alt19) {
            	case 1 :
            	    // plp4.g:1072:10: OR ea2= eand
            	    {
            	    OR55=(Token)match(input,OR,FOLLOW_OR_in_expr990); 
            	    pushFollow(FOLLOW_eand_in_expr1003);
            	    ea2=eand();

            	    state._fsp--;


            	    	
            	    		if((ea1!=null?ea1.tipo:null)!=Simbolo.TipoRetorno.BOOLEANO || ea2.tipo!=Simbolo.TipoRetorno.BOOLEANO){
            	    			ErrorSem4((OR55!=null?OR55.getLine():0),(OR55!=null?OR55.getCharPositionInLine():0),(OR55!=null?OR55.getText():null));
            	    		}
            	    		retval.eixida += (ea2!=null?ea2.eixida:null);
            	    		retval.eixida += "or\n";
            	    		retval.tipo = Simbolo.TipoRetorno.BOOLEANO;
            	            

            	    }
            	    break;

            	default :
            	    break loop19;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return retval;
    }
    // $ANTLR end "expr"

    public static class eand_return extends ParserRuleReturnScope {
        public String eixida;
        public Simbolo.TipoRetorno tipo;
        public boolean vector;
    };

    // $ANTLR start "eand"
    // plp4.g:1085:1: eand returns [String eixida, Simbolo.TipoRetorno tipo, boolean vector] : e1= erel ( AND e2= erel )* ;
    public final plp4Parser.eand_return eand() throws RecognitionException {
        plp4Parser.eand_return retval = new plp4Parser.eand_return();
        retval.start = input.LT(1);

        Token AND56=null;
        plp4Parser.erel_return e1 = null;

        plp4Parser.erel_return e2 = null;



        		String eixida2;
        		retval.eixida ="";
        		retval.vector = false;
        	
        try {
            // plp4.g:1090:3: (e1= erel ( AND e2= erel )* )
            // plp4.g:1091:9: e1= erel ( AND e2= erel )*
            {
            pushFollow(FOLLOW_erel_in_eand1047);
            e1=erel();

            state._fsp--;


            		retval.tipo = (e1!=null?e1.tipo:null);
            		retval.eixida += (e1!=null?e1.eixida:null);
            		retval.vector = (e1!=null?e1.vector:false);
                    
            // plp4.g:1096:9: ( AND e2= erel )*
            loop20:
            do {
                int alt20=2;
                int LA20_0 = input.LA(1);

                if ( (LA20_0==AND) ) {
                    alt20=1;
                }


                switch (alt20) {
            	case 1 :
            	    // plp4.g:1096:10: AND e2= erel
            	    {
            	    AND56=(Token)match(input,AND,FOLLOW_AND_in_eand1059); 
            	    pushFollow(FOLLOW_erel_in_eand1072);
            	    e2=erel();

            	    state._fsp--;


            	    		
            	    		if((e1!=null?e1.tipo:null)!=Simbolo.TipoRetorno.BOOLEANO || e2.tipo!=Simbolo.TipoRetorno.BOOLEANO)
            	    		{
            	    			ErrorSem4((AND56!=null?AND56.getLine():0),(AND56!=null?AND56.getCharPositionInLine():0),(AND56!=null?AND56.getText():null));
            	    		}
            	    		retval.eixida += (e2!=null?e2.eixida:null);
            	    		retval.eixida += "and\n";
            	    		retval.tipo = Simbolo.TipoRetorno.BOOLEANO;
            	            

            	    }
            	    break;

            	default :
            	    break loop20;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return retval;
    }
    // $ANTLR end "eand"

    public static class erel_return extends ParserRuleReturnScope {
        public String eixida;
        public Simbolo.TipoRetorno tipo;
        public boolean vector;
    };

    // $ANTLR start "erel"
    // plp4.g:1109:1: erel returns [String eixida, Simbolo.TipoRetorno tipo, boolean vector] : e1= esum ( RELOP e2= esum )* ;
    public final plp4Parser.erel_return erel() throws RecognitionException {
        plp4Parser.erel_return retval = new plp4Parser.erel_return();
        retval.start = input.LT(1);

        Token RELOP57=null;
        plp4Parser.esum_return e1 = null;

        plp4Parser.esum_return e2 = null;



        		Simbolo.TipoRetorno tipo2;
        		retval.eixida ="";
        		int salto1, salto2, salto3;
        		retval.vector = false;
        	
        try {
            // plp4.g:1115:3: (e1= esum ( RELOP e2= esum )* )
            // plp4.g:1116:9: e1= esum ( RELOP e2= esum )*
            {
            pushFollow(FOLLOW_esum_in_erel1115);
            e1=esum();

            state._fsp--;


            		retval.tipo = (e1!=null?e1.tipo:null);
            		retval.eixida += (e1!=null?e1.eixida:null);
            		retval.vector = (e1!=null?e1.vector:false);
                    
            // plp4.g:1121:9: ( RELOP e2= esum )*
            loop21:
            do {
                int alt21=2;
                int LA21_0 = input.LA(1);

                if ( (LA21_0==RELOP) ) {
                    alt21=1;
                }


                switch (alt21) {
            	case 1 :
            	    // plp4.g:1121:10: RELOP e2= esum
            	    {
            	    RELOP57=(Token)match(input,RELOP,FOLLOW_RELOP_in_erel1127); 
            	    pushFollow(FOLLOW_esum_in_erel1139);
            	    e2=esum();

            	    state._fsp--;


            	            	
            	         		if((e2!=null?e2.tipo:null) == Simbolo.TipoRetorno.REAL && retval.tipo != Simbolo.TipoRetorno.REAL){
            	         			retval.eixida+="conv.r8 //LITIO \n";
            	         		}
            	    		retval.eixida += (e2!=null?e2.eixida:null);
            	    		if(retval.tipo == Simbolo.TipoRetorno.REAL && (e2!=null?e2.tipo:null) != Simbolo.TipoRetorno.REAL){
            	         			retval.eixida+="conv.r8 //SODIO \n";
            	         		}
            	    		retval.tipo =Simbolo.TipoRetorno.BOOLEANO;
            	    		if((RELOP57!=null?RELOP57.getText():null).equals("==")){
            	    			retval.eixida += "beq ";
            	    		} else if((RELOP57!=null?RELOP57.getText():null).equals("!=")){
            	    			retval.eixida += "bne.un ";
            	    		} else if((RELOP57!=null?RELOP57.getText():null).equals("<")){
            	    			retval.eixida += "blt ";
            	    		} else if((RELOP57!=null?RELOP57.getText():null).equals(">")){
            	    			retval.eixida += "bgt ";
            	    		} else if((RELOP57!=null?RELOP57.getText():null).equals("<=")){
            	    			retval.eixida += "ble ";
            	    		} else {
            	    			retval.eixida += "bge ";
            	    		}
            	    		salto1 = TSimbolos.saltos++;
            	    		salto2 = TSimbolos.saltos++;
            	    		salto3 = TSimbolos.saltos++;
            	    		
            	    		retval.eixida += "L"+ salto1+ "\n";
            	    		retval.eixida += "br L" + salto2 + "\n";
            	    		retval.eixida += "L" + salto1+ ":\n";
            	    		retval.eixida += "ldc.i4 1\n";
            	    		retval.eixida += "br L" +salto3+ "\n";
            	    		retval.eixida += "L" + salto2+ ":\n";
            	    		retval.eixida += "ldc.i4 0\n";
            	    		retval.eixida += "L" + salto3 + ":\n";
            	            

            	    }
            	    break;

            	default :
            	    break loop21;
                }
            } while (true);


                    	
                    

            }

            retval.stop = input.LT(-1);

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return retval;
    }
    // $ANTLR end "erel"

    public static class esum_return extends ParserRuleReturnScope {
        public Simbolo.TipoRetorno tipo;
        public String eixida;
        public boolean vector;
    };

    // $ANTLR start "esum"
    // plp4.g:1163:1: esum returns [Simbolo.TipoRetorno tipo, String eixida, boolean vector] : t1= term ( ADDOP t2= term )* ;
    public final plp4Parser.esum_return esum() throws RecognitionException {
        plp4Parser.esum_return retval = new plp4Parser.esum_return();
        retval.start = input.LT(1);

        Token ADDOP58=null;
        plp4Parser.term_return t1 = null;

        plp4Parser.term_return t2 = null;



        		Simbolo.TipoRetorno tipo2;
        		retval.eixida ="";
        		retval.vector = false;
        	
        try {
            // plp4.g:1168:3: (t1= term ( ADDOP t2= term )* )
            // plp4.g:1169:9: t1= term ( ADDOP t2= term )*
            {
            pushFollow(FOLLOW_term_in_esum1187);
            t1=term();

            state._fsp--;


            		retval.tipo = (t1!=null?t1.tipo:null);
            		retval.eixida += (t1!=null?t1.eixida:null);
            		retval.vector = (t1!=null?t1.vector:false);
            		
            		
                    
            // plp4.g:1176:9: ( ADDOP t2= term )*
            loop22:
            do {
                int alt22=2;
                int LA22_0 = input.LA(1);

                if ( (LA22_0==ADDOP) ) {
                    alt22=1;
                }


                switch (alt22) {
            	case 1 :
            	    // plp4.g:1176:10: ADDOP t2= term
            	    {
            	    ADDOP58=(Token)match(input,ADDOP,FOLLOW_ADDOP_in_esum1199); 

            	            	if(retval.tipo == Simbolo.TipoRetorno.BOOLEANO){
            	    			ErrorSem3((ADDOP58!=null?ADDOP58.getLine():0),(ADDOP58!=null?ADDOP58.getCharPositionInLine():0),(ADDOP58!=null?ADDOP58.getText():null));
            	    		}
            	            
            	    pushFollow(FOLLOW_term_in_esum1212);
            	    t2=term();

            	    state._fsp--;


            	            	
            	         	
            	            	if((t2!=null?t2.tipo:null) == Simbolo.TipoRetorno.BOOLEANO){
            	    			ErrorSem3((ADDOP58!=null?ADDOP58.getLine():0),(ADDOP58!=null?ADDOP58.getCharPositionInLine():0),(ADDOP58!=null?ADDOP58.getText():null));
            	    		} else if(retval.tipo != Simbolo.TipoRetorno.REAL && (t2!=null?t2.tipo:null) == Simbolo.TipoRetorno.REAL){
            	    			retval.eixida += "conv.r8 //POTASIO \n";
            	    			retval.tipo = Simbolo.TipoRetorno.REAL;
            	    		}
            	            	retval.eixida += (t2!=null?t2.eixida:null);
            	            	if(retval.tipo == Simbolo.TipoRetorno.REAL && (t2!=null?t2.tipo:null) != Simbolo.TipoRetorno.REAL){
            	    			retval.eixida += "conv.r8 //RUBIDIO \n";
            	    			retval.tipo = Simbolo.TipoRetorno.REAL;
            	    		}
            	    		if((ADDOP58!=null?ADDOP58.getText():null).equals("+")){
            	    			retval.eixida += "add\n";
            	    		} else {
            	    			retval.eixida += "sub\n";
            	    		}
            	    		if(retval.tipo == Simbolo.TipoRetorno.REAL || (t2!=null?t2.tipo:null) == Simbolo.TipoRetorno.REAL){
            	    			retval.tipo = Simbolo.TipoRetorno.REAL;
            	    		}
            	            

            	    }
            	    break;

            	default :
            	    break loop22;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return retval;
    }
    // $ANTLR end "esum"

    public static class term_return extends ParserRuleReturnScope {
        public Simbolo.TipoRetorno tipo;
        public String eixida;
        public boolean vector;
    };

    // $ANTLR start "term"
    // plp4.g:1207:1: term returns [Simbolo.TipoRetorno tipo, String eixida, boolean vector] : m1= factor ( MULOP m2= factor )* ;
    public final plp4Parser.term_return term() throws RecognitionException {
        plp4Parser.term_return retval = new plp4Parser.term_return();
        retval.start = input.LT(1);

        Token MULOP59=null;
        plp4Parser.factor_return m1 = null;

        plp4Parser.factor_return m2 = null;



        		Simbolo.TipoRetorno tipo2;
        		retval.eixida ="";
        		retval.vector = false;
        	
        try {
            // plp4.g:1212:3: (m1= factor ( MULOP m2= factor )* )
            // plp4.g:1213:9: m1= factor ( MULOP m2= factor )*
            {
            pushFollow(FOLLOW_factor_in_term1259);
            m1=factor();

            state._fsp--;


            			retval.tipo = (m1!=null?m1.tipo:null);
            			retval.eixida += (m1!=null?m1.eixida:null);
            			retval.vector = (m1!=null?m1.vector:false);
            			
            	
            // plp4.g:1218:3: ( MULOP m2= factor )*
            loop23:
            do {
                int alt23=2;
                int LA23_0 = input.LA(1);

                if ( (LA23_0==MULOP) ) {
                    alt23=1;
                }


                switch (alt23) {
            	case 1 :
            	    // plp4.g:1218:4: MULOP m2= factor
            	    {
            	    MULOP59=(Token)match(input,MULOP,FOLLOW_MULOP_in_term1262); 

            	    		if(retval.tipo == Simbolo.TipoRetorno.BOOLEANO){
            	    			ErrorSem3((MULOP59!=null?MULOP59.getLine():0),(MULOP59!=null?MULOP59.getCharPositionInLine():0),(MULOP59!=null?MULOP59.getText():null));
            	    		}  
            	    	
            	    	
            	    pushFollow(FOLLOW_factor_in_term1267);
            	    m2=factor();

            	    state._fsp--;


            	    	          
            	            	if((m2!=null?m2.tipo:null) == Simbolo.TipoRetorno.BOOLEANO){
            	    			ErrorSem3((MULOP59!=null?MULOP59.getLine():0),(MULOP59!=null?MULOP59.getCharPositionInLine():0),(MULOP59!=null?MULOP59.getText():null));
            	    		} else if(retval.tipo == Simbolo.TipoRetorno.ENTERO && (m2!=null?m2.tipo:null) == Simbolo.TipoRetorno.REAL){
            	    			retval.eixida += "conv.r8 //CESIO \n";
            	    			retval.tipo = Simbolo.TipoRetorno.REAL;
            	    		}
            	            	retval.eixida += (m2!=null?m2.eixida:null);
            	            	if(retval.tipo == Simbolo.TipoRetorno.REAL && (m2!=null?m2.tipo:null) == Simbolo.TipoRetorno.ENTERO){
            	    			retval.eixida += "conv.r8 //FRANCIO\n";
            	    			retval.tipo = Simbolo.TipoRetorno.REAL;
            	    		}
            	            	
            	    		if((MULOP59!=null?MULOP59.getText():null).equals("*")){
            	    			retval.eixida += "mul\n";
            	    		} else {
            	    			retval.eixida += "div\n";
            	    		}
            	            

            	    }
            	    break;

            	default :
            	    break loop23;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return retval;
    }
    // $ANTLR end "term"

    public static class factor_return extends ParserRuleReturnScope {
        public Simbolo.TipoRetorno tipo;
        public String eixida;
        public boolean vector;
    };

    // $ANTLR start "factor"
    // plp4.g:1246:1: factor returns [Simbolo.TipoRetorno tipo, String eixida, boolean vector] : ( base | NOT f1= factor | PARI ADDOP f2= factor PARD );
    public final plp4Parser.factor_return factor() throws RecognitionException {
        plp4Parser.factor_return retval = new plp4Parser.factor_return();
        retval.start = input.LT(1);

        Token NOT61=null;
        Token ADDOP62=null;
        plp4Parser.factor_return f1 = null;

        plp4Parser.factor_return f2 = null;

        plp4Parser.base_return base60 = null;



        		retval.eixida = "";
        		int salto1,salto2;
        	
        try {
            // plp4.g:1250:3: ( base | NOT f1= factor | PARI ADDOP f2= factor PARD )
            int alt24=3;
            switch ( input.LA(1) ) {
            case ID:
            case ENTERO:
            case REAL:
            case BOOLEANO:
                {
                alt24=1;
                }
                break;
            case PARI:
                {
                int LA24_2 = input.LA(2);

                if ( (LA24_2==ADDOP) ) {
                    alt24=3;
                }
                else if ( (LA24_2==ID||LA24_2==PARI||(LA24_2>=ENTERO && LA24_2<=BOOLEANO)||LA24_2==NOT) ) {
                    alt24=1;
                }
                else {
                    NoViableAltException nvae =
                        new NoViableAltException("", 24, 2, input);

                    throw nvae;
                }
                }
                break;
            case NOT:
                {
                alt24=2;
                }
                break;
            default:
                NoViableAltException nvae =
                    new NoViableAltException("", 24, 0, input);

                throw nvae;
            }

            switch (alt24) {
                case 1 :
                    // plp4.g:1251:9: base
                    {
                    pushFollow(FOLLOW_base_in_factor1311);
                    base60=base();

                    state._fsp--;


                    		retval.tipo = (base60!=null?base60.tipo:null);
                    		retval.eixida += (base60!=null?base60.eixida:null);
                    		retval.vector = (base60!=null?base60.vector:false);
                            

                    }
                    break;
                case 2 :
                    // plp4.g:1256:8: NOT f1= factor
                    {
                    NOT61=(Token)match(input,NOT,FOLLOW_NOT_in_factor1321); 
                    pushFollow(FOLLOW_factor_in_factor1326);
                    f1=factor();

                    state._fsp--;


                        		salto1 = TSimbolos.saltos++;
                        		salto2 = TSimbolos.saltos++;
                        		retval.tipo = (f1!=null?f1.tipo:null);
                        		retval.eixida += (f1!=null?f1.eixida:null);
                        		if(retval.tipo!=Simbolo.TipoRetorno.BOOLEANO){
                        			ErrorSem4((NOT61!=null?NOT61.getLine():0),(NOT61!=null?NOT61.getCharPositionInLine():0),(NOT61!=null?NOT61.getText():null));
                        		} else {
                        			retval.eixida += "ldc.i4.0\n";
                        			retval.eixida += "beq L"+ Integer.valueOf(salto1).toString()+"\n";
                        			retval.eixida += "ldc.i4.0\n";
                        			retval.eixida += "br L"+  Integer.valueOf(salto2).toString()+"\n";
                        			retval.eixida += "L"+ Integer.valueOf(salto1).toString()+":\n";
                        			retval.eixida += "ldc.i4.1\n";
                        			retval.eixida += "L" +  Integer.valueOf(salto2).toString() + ":\n";
                        		}
                            

                    }
                    break;
                case 3 :
                    // plp4.g:1273:11: PARI ADDOP f2= factor PARD
                    {
                    match(input,PARI,FOLLOW_PARI_in_factor1339); 
                    ADDOP62=(Token)match(input,ADDOP,FOLLOW_ADDOP_in_factor1341); 
                    pushFollow(FOLLOW_factor_in_factor1347);
                    f2=factor();

                    state._fsp--;


                            	if((f2!=null?f2.tipo:null) == Simbolo.TipoRetorno.BOOLEANO){
                            		ErrorSem3((ADDOP62!=null?ADDOP62.getLine():0),(ADDOP62!=null?ADDOP62.getCharPositionInLine():0),(ADDOP62!=null?ADDOP62.getText():null));
                            	}
                            	 if((ADDOP62!=null?ADDOP62.getText():null).equals("-")){
                            	 	retval.eixida += (f2!=null?f2.eixida:null);
                            	 	retval.eixida += "neg\n";
                            	 }
                            	 retval.tipo = (f2!=null?f2.tipo:null);
                            
                    match(input,PARD,FOLLOW_PARD_in_factor1358); 

                    }
                    break;

            }
            retval.stop = input.LT(-1);

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return retval;
    }
    // $ANTLR end "factor"

    public static class base_return extends ParserRuleReturnScope {
        public Simbolo.TipoRetorno tipo;
        public String eixida;
        public boolean vector;
    };

    // $ANTLR start "base"
    // plp4.g:1286:1: base returns [Simbolo.TipoRetorno tipo, String eixida, boolean vector] : ( ENTERO | REAL | BOOLEANO | PARI expr PARD | ref[false] | subref[true] PARI params[null] PARD );
    public final plp4Parser.base_return base() throws RecognitionException {
        plp4Parser.base_return retval = new plp4Parser.base_return();
        retval.start = input.LT(1);

        Token ENTERO63=null;
        Token REAL64=null;
        Token BOOLEANO65=null;
        plp4Parser.expr_return expr66 = null;

        plp4Parser.ref_return ref67 = null;



        		retval.eixida = "";
        		retval.vector = false;
        	
        try {
            // plp4.g:1290:3: ( ENTERO | REAL | BOOLEANO | PARI expr PARD | ref[false] | subref[true] PARI params[null] PARD )
            int alt25=6;
            alt25 = dfa25.predict(input);
            switch (alt25) {
                case 1 :
                    // plp4.g:1291:10: ENTERO
                    {
                    ENTERO63=(Token)match(input,ENTERO,FOLLOW_ENTERO_in_base1391); 

                             	retval.eixida += "ldc.i4 "+ (ENTERO63!=null?ENTERO63.getText():null) +"\n";         	 
                             	retval.tipo = Simbolo.TipoRetorno.ENTERO;
                             	fila = (ENTERO63!=null?ENTERO63.getLine():0);
                             	columna = (ENTERO63!=null?ENTERO63.getCharPositionInLine():0);
                             	error = (ENTERO63!=null?ENTERO63.getText():null);
                             

                    }
                    break;
                case 2 :
                    // plp4.g:1298:12: REAL
                    {
                    REAL64=(Token)match(input,REAL,FOLLOW_REAL_in_base1406); 

                            
                             	retval.eixida += "ldc.r8 "+ (REAL64!=null?REAL64.getText():null) +"\n";
                             	retval.tipo = Simbolo.TipoRetorno.REAL;
                             	fila = (REAL64!=null?REAL64.getLine():0);
                             	columna = (REAL64!=null?REAL64.getCharPositionInLine():0);
                             	error = (REAL64!=null?REAL64.getText():null);
                             

                    }
                    break;
                case 3 :
                    // plp4.g:1306:12: BOOLEANO
                    {
                    BOOLEANO65=(Token)match(input,BOOLEANO,FOLLOW_BOOLEANO_in_base1421); 

                             
                             	if((BOOLEANO65!=null?BOOLEANO65.getText():null).equals("True")){
                             		retval.eixida += "ldc.i4.1\n";
                             	} else {
                             		retval.eixida += "ldc.i4.0\n";
                             	}
                             	retval.tipo = Simbolo.TipoRetorno.BOOLEANO;	
                             	fila = (BOOLEANO65!=null?BOOLEANO65.getLine():0);
                             	columna = (BOOLEANO65!=null?BOOLEANO65.getCharPositionInLine():0);
                             	error = (BOOLEANO65!=null?BOOLEANO65.getText():null);
                             

                    }
                    break;
                case 4 :
                    // plp4.g:1319:8: PARI expr PARD
                    {
                    match(input,PARI,FOLLOW_PARI_in_base1433); 
                    pushFollow(FOLLOW_expr_in_base1435);
                    expr66=expr();

                    state._fsp--;


                        		retval.vector = true;
                        		retval.eixida += (expr66!=null?expr66.eixida:null);
                        		retval.tipo = (expr66!=null?expr66.tipo:null);
                            
                    match(input,PARD,FOLLOW_PARD_in_base1446); 

                    }
                    break;
                case 5 :
                    // plp4.g:1326:9: ref[false]
                    {
                    pushFollow(FOLLOW_ref_in_base1466);
                    ref67=ref(false);

                    state._fsp--;


                        		retval.eixida += (ref67!=null?ref67.eixida:null);
                        		retval.tipo = (ref67!=null?ref67.tipo:null);
                            

                    }
                    break;
                case 6 :
                    // plp4.g:1332:9: subref[true] PARI params[null] PARD
                    {
                    pushFollow(FOLLOW_subref_in_base1498);
                    subref(true);

                    state._fsp--;

                    match(input,PARI,FOLLOW_PARI_in_base1501); 
                    pushFollow(FOLLOW_params_in_base1503);
                    params(null);

                    state._fsp--;

                    match(input,PARD,FOLLOW_PARD_in_base1506); 

                    }
                    break;

            }
            retval.stop = input.LT(-1);

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return retval;
    }
    // $ANTLR end "base"

    public static class ref_return extends ParserRuleReturnScope {
        public int numRef;
        public Simbolo.TipoRetorno tipo;
        public boolean isVector;
        public int posVector;
        public String eixida;
        public String eixida2;
        public boolean error15;
        public boolean vector;
    };

    // $ANTLR start "ref"
    // plp4.g:1336:1: ref[boolean escritura] returns [int numRef, Simbolo.TipoRetorno tipo, boolean isVector, int posVector, String eixida, String eixida2, boolean error15, boolean vector] : subref[$escritura] ( CORI indices[s, $CORI.line, $CORI.pos,$subref.line,$subref.pos, $subref.text] CORD )? ;
    public final plp4Parser.ref_return ref(boolean escritura) throws RecognitionException {
        plp4Parser.ref_return retval = new plp4Parser.ref_return();
        retval.start = input.LT(1);

        Token CORI69=null;
        plp4Parser.subref_return subref68 = null;

        plp4Parser.indices_return indices70 = null;



        		Simbolo s= null;
        		retval.isVector = false;
        		retval.eixida = "";
        		retval.eixida2 = "";
        		retval.vector = false;
        		String comodin = "";
        		
        	
        try {
            // plp4.g:1345:3: ( subref[$escritura] ( CORI indices[s, $CORI.line, $CORI.pos,$subref.line,$subref.pos, $subref.text] CORD )? )
            // plp4.g:1346:13: subref[$escritura] ( CORI indices[s, $CORI.line, $CORI.pos,$subref.line,$subref.pos, $subref.text] CORD )?
            {
            pushFollow(FOLLOW_subref_in_ref1540);
            subref68=subref(escritura);

            state._fsp--;



                        retval.eixida = (subref68!=null?subref68.eixida:null);
                        retval.error15 = (subref68!=null?subref68.error15:false);
                        retval.tipo = (subref68!=null?subref68.tipo:null);
                        retval.numRef = (subref68!=null?subref68.numRef:0);
                        
                        
            // plp4.g:1354:11: ( CORI indices[s, $CORI.line, $CORI.pos,$subref.line,$subref.pos, $subref.text] CORD )?
            int alt26=2;
            int LA26_0 = input.LA(1);

            if ( (LA26_0==CORI) ) {
                alt26=1;
            }
            switch (alt26) {
                case 1 :
                    // plp4.g:1354:12: CORI indices[s, $CORI.line, $CORI.pos,$subref.line,$subref.pos, $subref.text] CORD
                    {
                    CORI69=(Token)match(input,CORI,FOLLOW_CORI_in_ref1555); 
                    pushFollow(FOLLOW_indices_in_ref1557);
                    indices70=indices(s, (CORI69!=null?CORI69.getLine():0), (CORI69!=null?CORI69.getCharPositionInLine():0), (subref68!=null?subref68.line:0), (subref68!=null?subref68.pos:0), (subref68!=null?subref68.text:null));

                    state._fsp--;


                               	retval.vector = true;
                               	if(s.clase!=Simbolo.ClaseDato.VECTOR){
                               		ErrorSem11((subref68!=null?subref68.line:0),(subref68!=null?subref68.pos:0),(subref68!=null?subref68.text:null));
                               	}
                               	retval.isVector = true;
                               	retval.eixida += (indices70!=null?indices70.eixida:null);
                           		
                               	if(s.dims.size()<(indices70!=null?indices70.cont:0)){
                    			ErrorSem9(fila,columna,error);
                    		}
                               
                    match(input,CORD,FOLLOW_CORD_in_ref1584); 

                    }
                    break;

            }


                       	if(retval.isVector){
                       		retval.eixida = "ldloc "+ Integer.valueOf(s.num).toString()+ "\n";
                       		retval.eixida += (indices70!=null?indices70.eixida:null);
                       		if(escritura){
                       			if(s.retorno == Simbolo.TipoRetorno.REAL){
                       				retval.eixida2 += "stelem.r8\n";
                       			} else {
                       				retval.eixida2 += "stelem.i4\n";
                       			}
                       		} else {
                       			if(s.retorno == Simbolo.TipoRetorno.REAL){
                       				retval.eixida += "ldelem.r8\n";
                       			} else {
                       				retval.eixida += "ldelem.i4\n";
                       			}
                       		}
                       	
                       	}
                       		
                       

            }

            retval.stop = input.LT(-1);

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return retval;
    }
    // $ANTLR end "ref"

    public static class indices_return extends ParserRuleReturnScope {
        public String eixida;
        public int cont;
    };

    // $ANTLR start "indices"
    // plp4.g:1390:1: indices[Simbolo sim, int lineCorchete, int posCorchete, int linId, int posId, String idId] returns [String eixida,int cont] : e1= expr ( COMA e2= expr )* ;
    public final plp4Parser.indices_return indices(Simbolo sim, int lineCorchete, int posCorchete, int linId, int posId, String idId) throws RecognitionException {
        plp4Parser.indices_return retval = new plp4Parser.indices_return();
        retval.start = input.LT(1);

        Token COMA71=null;
        plp4Parser.expr_return e1 = null;

        plp4Parser.expr_return e2 = null;



        		retval.eixida ="";
        		int cont = 0;
        		Simbolo.TipoRetorno tipo;
        		int numIndices = sim.dims.size();
        	
        	
        try {
            // plp4.g:1397:3: (e1= expr ( COMA e2= expr )* )
            // plp4.g:1398:2: e1= expr ( COMA e2= expr )*
            {
            pushFollow(FOLLOW_expr_in_indices1631);
            e1=expr();

            state._fsp--;


            		tipo = (e1!=null?e1.tipo:null);
            		retval.eixida += (e1!=null?e1.eixida:null);
            		cont++;
            		
            		if((e1!=null?e1.tipo:null) == Simbolo.TipoRetorno.BOOLEANO){
            			ErrorSem13(lineCorchete,posCorchete,error);
            		
            		}
            		if(tipo == Simbolo.TipoRetorno.REAL){
                    		retval.eixida += "conv.i4\n";
                    	}
                    	
            		
            		/*if(cont>sim.dims.size()){
            			
            			ErrorSem11(linId,posId,idId);
            		}*/
                    
            // plp4.g:1417:9: ( COMA e2= expr )*
            loop27:
            do {
                int alt27=2;
                int LA27_0 = input.LA(1);

                if ( (LA27_0==COMA) ) {
                    alt27=1;
                }


                switch (alt27) {
            	case 1 :
            	    // plp4.g:1417:10: COMA e2= expr
            	    {
            	    COMA71=(Token)match(input,COMA,FOLLOW_COMA_in_indices1643); 

            	            	if(cont==1){
            	           			retval.eixida += "ldc.i4 " + Integer.valueOf(sim.calculoDims(cont)).toString()+"\n";
            	            		retval.eixida += "mul\n";
            	            	}
            	            
            	            
            	    pushFollow(FOLLOW_expr_in_indices1658);
            	    e2=expr();

            	    state._fsp--;


            	            	cont++;
            	            	if(cont>sim.dims.size()){
            	    			ErrorSem12((COMA71!=null?COMA71.getLine():0),(COMA71!=null?COMA71.getCharPositionInLine():0),error);
            	    		}
            	            	if((e2!=null?e2.tipo:null) == Simbolo.TipoRetorno.BOOLEANO){
            	            		ErrorSem13((COMA71!=null?COMA71.getLine():0),(COMA71!=null?COMA71.getCharPositionInLine():0),error);
            	            	
            	            	}
            	            	
            	            	
            	            	retval.eixida += (e2!=null?e2.eixida:null);
            	            	if((e2!=null?e2.tipo:null) == Simbolo.TipoRetorno.REAL){
            	            		retval.eixida += "conv.i4\n";
            	            		
            	            	}
            	            	retval.eixida += "ldc.i4 " + Integer.valueOf(sim.calculoDims(cont)).toString()+"\n";
            	            	retval.eixida += "mul\n";
            	            	retval.eixida += "add\n";
            	            	
            	    				
            	    		if(cont>sim.dims.size()){
            	    			ErrorSem12((COMA71!=null?COMA71.getLine():0),(COMA71!=null?COMA71.getCharPositionInLine():0),error);
            	    		}
            	            

            	    }
            	    break;

            	default :
            	    break loop27;
                }
            } while (true);

            	
            		if(sim.dims.size()>cont){
            			ErrorSem9(linId,posId,idId);
            		}
            	

            }

            retval.stop = input.LT(-1);

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return retval;
    }
    // $ANTLR end "indices"

    public static class miembro_return extends ParserRuleReturnScope {
        public String eixida;
        public ArrayList<Simbolo> simbolos;
    };

    // $ANTLR start "miembro"
    // plp4.g:1456:1: miembro[Simbolo clase] returns [String eixida, ArrayList<Simbolo> simbolos] : ( campo[clase] | metodo[clase] | propiedad );
    public final plp4Parser.miembro_return miembro(Simbolo clase) throws RecognitionException {
        plp4Parser.miembro_return retval = new plp4Parser.miembro_return();
        retval.start = input.LT(1);

        plp4Parser.campo_return campo72 = null;

        plp4Parser.metodo_return metodo73 = null;



        		retval.simbolos = new ArrayList<Simbolo>();		
        	
        try {
            // plp4.g:1459:3: ( campo[clase] | metodo[clase] | propiedad )
            int alt28=3;
            alt28 = dfa28.predict(input);
            switch (alt28) {
                case 1 :
                    // plp4.g:1460:2: campo[clase]
                    {
                    pushFollow(FOLLOW_campo_in_miembro1692);
                    campo72=campo(clase);

                    state._fsp--;


                    		retval.simbolos = (campo72!=null?campo72.simbolos:null);
                    		retval.eixida = (campo72!=null?campo72.eixida:null);
                    				
                    	

                    }
                    break;
                case 2 :
                    // plp4.g:1466:2: metodo[clase]
                    {
                    pushFollow(FOLLOW_metodo_in_miembro1701);
                    metodo73=metodo(clase);

                    state._fsp--;


                    		retval.simbolos.add((metodo73!=null?metodo73.smetodo:null)	);
                    		retval.eixida = (metodo73!=null?metodo73.eixida:null);
                    		
                    	

                    }
                    break;
                case 3 :
                    // plp4.g:1472:2: propiedad
                    {
                    pushFollow(FOLLOW_propiedad_in_miembro1709);
                    propiedad();

                    state._fsp--;


                    		
                    	

                    }
                    break;

            }
            retval.stop = input.LT(-1);

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return retval;
    }
    // $ANTLR end "miembro"

    public static class campo_return extends ParserRuleReturnScope {
        public String eixida;
        public ArrayList<Simbolo> simbolos;
    };

    // $ANTLR start "campo"
    // plp4.g:1478:1: campo[Simbolo clase] returns [String eixida, ArrayList<Simbolo> simbolos] : visibilidad decl ;
    public final plp4Parser.campo_return campo(Simbolo clase) throws RecognitionException {
        plp4Parser.campo_return retval = new plp4Parser.campo_return();
        retval.start = input.LT(1);

        plp4Parser.decl_return decl74 = null;

        plp4Parser.visibilidad_return visibilidad75 = null;



        		
        	
        try {
            // plp4.g:1481:3: ( visibilidad decl )
            // plp4.g:1482:2: visibilidad decl
            {
            pushFollow(FOLLOW_visibilidad_in_campo1732);
            visibilidad75=visibilidad();

            state._fsp--;

            pushFollow(FOLLOW_decl_in_campo1734);
            decl74=decl();

            state._fsp--;


            		retval.simbolos = (decl74!=null?decl74.simbolos:null);
            		for(Simbolo s: retval.simbolos){
            			//s.simboloPadre = clase;
            			if(clase.tabla.existe(s)){
            				//ERROR EXISTE CAMPO
            			} else {
            				clase.tabla.nuevoAPelo(s);
            			}
            			retval.eixida += ".field " + (visibilidad75!=null?visibilidad75.eixida:null);
            			
            			if(s.retorno == Simbolo.TipoRetorno.REAL){
            				retval.eixida += "float64 ";
            			} else {
            				retval.eixida += "int32 ";
            			}
            			retval.eixida += "'"+ s.nombre +"'\n";	
            		}
            	

            }

            retval.stop = input.LT(-1);

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return retval;
    }
    // $ANTLR end "campo"

    public static class visibilidad_return extends ParserRuleReturnScope {
        public String eixida;
        public boolean privado;
    };

    // $ANTLR start "visibilidad"
    // plp4.g:1503:1: visibilidad returns [String eixida, boolean privado] : ( PRIVATE | PUBLIC );
    public final plp4Parser.visibilidad_return visibilidad() throws RecognitionException {
        plp4Parser.visibilidad_return retval = new plp4Parser.visibilidad_return();
        retval.start = input.LT(1);


        	
        try {
            // plp4.g:1505:3: ( PRIVATE | PUBLIC )
            int alt29=2;
            int LA29_0 = input.LA(1);

            if ( (LA29_0==PRIVATE) ) {
                alt29=1;
            }
            else if ( (LA29_0==PUBLIC) ) {
                alt29=2;
            }
            else {
                NoViableAltException nvae =
                    new NoViableAltException("", 29, 0, input);

                throw nvae;
            }
            switch (alt29) {
                case 1 :
                    // plp4.g:1506:2: PRIVATE
                    {
                    match(input,PRIVATE,FOLLOW_PRIVATE_in_visibilidad1755); 

                    		retval.privado = true;
                    		retval.eixida = "private ";
                    	

                    }
                    break;
                case 2 :
                    // plp4.g:1511:2: PUBLIC
                    {
                    match(input,PUBLIC,FOLLOW_PUBLIC_in_visibilidad1762); 

                    		retval.privado = false;
                    		retval.eixida = "public ";
                    	
                    	

                    }
                    break;

            }
            retval.stop = input.LT(-1);

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return retval;
    }
    // $ANTLR end "visibilidad"

    public static class args_return extends ParserRuleReturnScope {
        public String eixida;
        public ArrayList<String> params;
    };

    // $ANTLR start "args"
    // plp4.g:1518:1: args returns [String eixida, ArrayList<String> params] : (d1= DOUBLE id1= ID ( COMA d2= DOUBLE id2= ID )* )? ;
    public final plp4Parser.args_return args() throws RecognitionException {
        plp4Parser.args_return retval = new plp4Parser.args_return();
        retval.start = input.LT(1);

        Token d1=null;
        Token id1=null;
        Token d2=null;
        Token id2=null;


        		 retval.eixida = "";
        		retval.params = new ArrayList<String>();
        	
        try {
            // plp4.g:1522:3: ( (d1= DOUBLE id1= ID ( COMA d2= DOUBLE id2= ID )* )? )
            // plp4.g:1523:2: (d1= DOUBLE id1= ID ( COMA d2= DOUBLE id2= ID )* )?
            {
            // plp4.g:1523:2: (d1= DOUBLE id1= ID ( COMA d2= DOUBLE id2= ID )* )?
            int alt31=2;
            int LA31_0 = input.LA(1);

            if ( (LA31_0==DOUBLE) ) {
                alt31=1;
            }
            switch (alt31) {
                case 1 :
                    // plp4.g:1523:3: d1= DOUBLE id1= ID ( COMA d2= DOUBLE id2= ID )*
                    {
                    d1=(Token)match(input,DOUBLE,FOLLOW_DOUBLE_in_args1786); 

                    		retval.eixida += "double64";
                    	
                    id1=(Token)match(input,ID,FOLLOW_ID_in_args1790); 

                    		retval.params.add((id1!=null?id1.getText():null));
                    	
                    // plp4.g:1527:3: ( COMA d2= DOUBLE id2= ID )*
                    loop30:
                    do {
                        int alt30=2;
                        int LA30_0 = input.LA(1);

                        if ( (LA30_0==COMA) ) {
                            alt30=1;
                        }


                        switch (alt30) {
                    	case 1 :
                    	    // plp4.g:1527:4: COMA d2= DOUBLE id2= ID
                    	    {
                    	    match(input,COMA,FOLLOW_COMA_in_args1793); 
                    	    d2=(Token)match(input,DOUBLE,FOLLOW_DOUBLE_in_args1798); 

                    	    		retval.eixida += " double64";
                    	    	
                    	    id2=(Token)match(input,ID,FOLLOW_ID_in_args1803); 

                    	    		retval.params.add((id2!=null?id2.getText():null));
                    	    	
                    	    	

                    	    }
                    	    break;

                    	default :
                    	    break loop30;
                        }
                    } while (true);


                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return retval;
    }
    // $ANTLR end "args"


    // $ANTLR start "propiedad"
    // plp4.g:1535:1: propiedad returns [String eixida] : PROPERTY tiposimple ID LLAVEI accesores LLAVED ;
    public final String propiedad() throws RecognitionException {
        String eixida = null;


        	
        try {
            // plp4.g:1537:3: ( PROPERTY tiposimple ID LLAVEI accesores LLAVED )
            // plp4.g:1538:2: PROPERTY tiposimple ID LLAVEI accesores LLAVED
            {
            match(input,PROPERTY,FOLLOW_PROPERTY_in_propiedad1828); 
            pushFollow(FOLLOW_tiposimple_in_propiedad1830);
            tiposimple();

            state._fsp--;

            match(input,ID,FOLLOW_ID_in_propiedad1832); 
            match(input,LLAVEI,FOLLOW_LLAVEI_in_propiedad1834); 
            pushFollow(FOLLOW_accesores_in_propiedad1836);
            accesores();

            state._fsp--;

            match(input,LLAVED,FOLLOW_LLAVED_in_propiedad1838); 

            }

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return eixida;
    }
    // $ANTLR end "propiedad"


    // $ANTLR start "accesores"
    // plp4.g:1541:1: accesores returns [String exida] : ( ( GET bloque[true] )? ( SET bloque[true] )? | GET PYC SET PYC );
    public final String accesores() throws RecognitionException {
        String exida = null;


        	
        try {
            // plp4.g:1543:3: ( ( GET bloque[true] )? ( SET bloque[true] )? | GET PYC SET PYC )
            int alt34=2;
            int LA34_0 = input.LA(1);

            if ( (LA34_0==GET) ) {
                int LA34_1 = input.LA(2);

                if ( (LA34_1==PYC) ) {
                    alt34=2;
                }
                else if ( (LA34_1==LLAVEI) ) {
                    alt34=1;
                }
                else {
                    NoViableAltException nvae =
                        new NoViableAltException("", 34, 1, input);

                    throw nvae;
                }
            }
            else if ( (LA34_0==LLAVED||LA34_0==SET) ) {
                alt34=1;
            }
            else {
                NoViableAltException nvae =
                    new NoViableAltException("", 34, 0, input);

                throw nvae;
            }
            switch (alt34) {
                case 1 :
                    // plp4.g:1544:2: ( GET bloque[true] )? ( SET bloque[true] )?
                    {
                    // plp4.g:1544:2: ( GET bloque[true] )?
                    int alt32=2;
                    int LA32_0 = input.LA(1);

                    if ( (LA32_0==GET) ) {
                        alt32=1;
                    }
                    switch (alt32) {
                        case 1 :
                            // plp4.g:1544:3: GET bloque[true]
                            {
                            match(input,GET,FOLLOW_GET_in_accesores1859); 
                            pushFollow(FOLLOW_bloque_in_accesores1861);
                            bloque(true);

                            state._fsp--;


                            }
                            break;

                    }

                    // plp4.g:1545:2: ( SET bloque[true] )?
                    int alt33=2;
                    int LA33_0 = input.LA(1);

                    if ( (LA33_0==SET) ) {
                        alt33=1;
                    }
                    switch (alt33) {
                        case 1 :
                            // plp4.g:1545:3: SET bloque[true]
                            {
                            match(input,SET,FOLLOW_SET_in_accesores1868); 
                            pushFollow(FOLLOW_bloque_in_accesores1870);
                            bloque(true);

                            state._fsp--;


                            }
                            break;

                    }


                    }
                    break;
                case 2 :
                    // plp4.g:1547:2: GET PYC SET PYC
                    {
                    match(input,GET,FOLLOW_GET_in_accesores1879); 
                    match(input,PYC,FOLLOW_PYC_in_accesores1881); 
                    match(input,SET,FOLLOW_SET_in_accesores1883); 
                    match(input,PYC,FOLLOW_PYC_in_accesores1885); 

                    }
                    break;

            }
        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return exida;
    }
    // $ANTLR end "accesores"

    public static class tipo_return extends ParserRuleReturnScope {
        public String exida;
        public String locals;
        public Simbolo.TipoRetorno tipo;
    };

    // $ANTLR start "tipo"
    // plp4.g:1550:1: tipo returns [String exida, String locals, Simbolo.TipoRetorno tipo] : ( ID | tiposimple );
    public final plp4Parser.tipo_return tipo() throws RecognitionException {
        plp4Parser.tipo_return retval = new plp4Parser.tipo_return();
        retval.start = input.LT(1);

        plp4Parser.tiposimple_return tiposimple76 = null;



        		retval.locals = "";
        	
        try {
            // plp4.g:1553:3: ( ID | tiposimple )
            int alt35=2;
            int LA35_0 = input.LA(1);

            if ( (LA35_0==ID) ) {
                alt35=1;
            }
            else if ( ((LA35_0>=INT && LA35_0<=BOOL)) ) {
                alt35=2;
            }
            else {
                NoViableAltException nvae =
                    new NoViableAltException("", 35, 0, input);

                throw nvae;
            }
            switch (alt35) {
                case 1 :
                    // plp4.g:1554:2: ID
                    {
                    match(input,ID,FOLLOW_ID_in_tipo1905); 

                    }
                    break;
                case 2 :
                    // plp4.g:1556:2: tiposimple
                    {
                    pushFollow(FOLLOW_tiposimple_in_tipo1911);
                    tiposimple76=tiposimple();

                    state._fsp--;


                    		retval.locals = (tiposimple76!=null?tiposimple76.locals:null);
                    		retval.tipo = (tiposimple76!=null?tiposimple76.tipo:null);	
                    	
                    	

                    }
                    break;

            }
            retval.stop = input.LT(-1);

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return retval;
    }
    // $ANTLR end "tipo"


    // $ANTLR start "params"
    // plp4.g:1563:1: params[Simbolo metodoEnCuestion] returns [String eixida] : ( expr ( COMA expr )* )? ;
    public final String params(Simbolo metodoEnCuestion) throws RecognitionException {
        String eixida = null;

        try {
            // plp4.g:1564:9: ( ( expr ( COMA expr )* )? )
            // plp4.g:1565:2: ( expr ( COMA expr )* )?
            {
            // plp4.g:1565:2: ( expr ( COMA expr )* )?
            int alt37=2;
            int LA37_0 = input.LA(1);

            if ( (LA37_0==ID||LA37_0==PARI||(LA37_0>=ENTERO && LA37_0<=BOOLEANO)||LA37_0==NOT) ) {
                alt37=1;
            }
            switch (alt37) {
                case 1 :
                    // plp4.g:1565:3: expr ( COMA expr )*
                    {
                    pushFollow(FOLLOW_expr_in_params1933);
                    expr();

                    state._fsp--;

                    // plp4.g:1565:8: ( COMA expr )*
                    loop36:
                    do {
                        int alt36=2;
                        int LA36_0 = input.LA(1);

                        if ( (LA36_0==COMA) ) {
                            alt36=1;
                        }


                        switch (alt36) {
                    	case 1 :
                    	    // plp4.g:1565:9: COMA expr
                    	    {
                    	    match(input,COMA,FOLLOW_COMA_in_params1936); 
                    	    pushFollow(FOLLOW_expr_in_params1938);
                    	    expr();

                    	    state._fsp--;


                    	    }
                    	    break;

                    	default :
                    	    break loop36;
                        }
                    } while (true);


                    }
                    break;

            }


            }

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return eixida;
    }
    // $ANTLR end "params"

    public static class subref_return extends ParserRuleReturnScope {
        public String eixida;
        public int line;
        public int pos;
        public String text;
        public Simbolo.TipoRetorno tipo;
        public boolean error15;
        public int numRef;
    };

    // $ANTLR start "subref"
    // plp4.g:1568:2: subref[boolean escritura] returns [String eixida, int line, int pos, String text, Simbolo.TipoRetorno tipo, boolean error15, int numRef] : id1= ID ( PUNTO id2= ID )* ;
    public final plp4Parser.subref_return subref(boolean escritura) throws RecognitionException {
        plp4Parser.subref_return retval = new plp4Parser.subref_return();
        retval.start = input.LT(1);

        Token id1=null;
        Token id2=null;

        try {
            // plp4.g:1569:9: (id1= ID ( PUNTO id2= ID )* )
            // plp4.g:1569:10: id1= ID ( PUNTO id2= ID )*
            {

            		retval.line = -1;
            		retval.pos = -1;
            		retval.text = "";
            		retval.eixida = "";
            		String comodin= "";
            		Simbolo s = null;
            	
            id1=(Token)match(input,ID,FOLLOW_ID_in_subref1968); 

            		retval.line = (id1!=null?id1.getLine():0);
            		retval.pos = (id1!=null?id1.getCharPositionInLine():0);
            		retval.text = (id1!=null?id1.getText():null);
            		
            		
                       	s = tSimbolos.busca(retval.text);
                       	if(s == null){
                       		ErrorSem2(retval.line,retval.pos,retval.text);	
                       	}
                       	retval.numRef = s.num ; 
                       	retval.tipo = s.retorno;
                       	
                       	if(s.num == -2){
                       		 comodin += "ldarg 0\n";
                       		 if(!escritura){
                       			 comodin += "ldfld ";
                       		} else {
                       			comodin += "stfld "; 
                       		}
                       		 if(s.retorno == Simbolo.TipoRetorno.REAL){
                       		 	comodin += "float64";
                       		 } else {
                       		 	comodin += "int32";
                       		 }
                       		 if(s.clase == Simbolo.ClaseDato.VECTOR){
                       		 	comodin += "[]";
                       		 }
                       		 comodin += "'" + s.clasePadre + "'::'" + s.nombre + "'\n";
                       		 retval.eixida += comodin;
                       	} else {          	
            			if(escritura){
            				if(s.clase == Simbolo.ClaseDato.CONSTANTE){
            					retval.error15 = true;
            				}
            				retval.eixida += "stloc " + Integer.valueOf(s.num).toString()+"\n";
            			} else {
            				retval.eixida += "ldloc " + Integer.valueOf(s.num).toString() +"\n";
            			}
            	          }
            	
            	
            // plp4.g:1618:4: ( PUNTO id2= ID )*
            loop38:
            do {
                int alt38=2;
                int LA38_0 = input.LA(1);

                if ( (LA38_0==PUNTO) ) {
                    int LA38_2 = input.LA(2);

                    if ( (LA38_2==ID) ) {
                        alt38=1;
                    }


                }


                switch (alt38) {
            	case 1 :
            	    // plp4.g:1618:6: PUNTO id2= ID
            	    {
            	    match(input,PUNTO,FOLLOW_PUNTO_in_subref1973); 
            	    id2=(Token)match(input,ID,FOLLOW_ID_in_subref1977); 

            	    	
            	    		retval.line = (id2!=null?id2.getLine():0);
            	                	retval.pos = (id2!=null?id2.getCharPositionInLine():0);
            	                	retval.text = (id2!=null?id2.getText():null);
            	               	s = tSimbolos.busca(retval.text);
            	               	if(s == null){
            	               		ErrorSem2(retval.line,retval.pos,retval.text);	
            	               	}
            	               	retval.numRef = s.num ; 
            	               	retval.tipo = s.retorno;
            	               	           	
            	               	/* SALCHICHITAS */
            	               	if(s.num == -2){
            	               		 comodin += "ldarg 0\n";
            	               		 if(!escritura){
            	               			 comodin += "ldfld ";
            	               		} else {
            	               			comodin += "stfld "; 
            	               		}
            	               		 if(s.retorno == Simbolo.TipoRetorno.REAL){
            	               		 	comodin += "float64";
            	               		 } else {
            	               		 	comodin += "int32";
            	               		 }
            	               		 if(s.clase == Simbolo.ClaseDato.VECTOR){
            	               		 	comodin += "[]";
            	               		 }
            	               		 comodin += "'" + s.clasePadre + "'::'" + s.nombre + "'\n";
            	               		retval.eixida += comodin;
            	               	} 

            	    	

            	    }
            	    break;

            	default :
            	    break loop38;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);

        }

        	catch (RecognitionException e) {
        		reportError(e);
        		System.exit(1);
        	}
        finally {
        }
        return retval;
    }
    // $ANTLR end "subref"

    // Delegated rules


    protected DFA15 dfa15 = new DFA15(this);
    protected DFA25 dfa25 = new DFA25(this);
    protected DFA28 dfa28 = new DFA28(this);
    static final String DFA15_eotS =
        "\25\uffff";
    static final String DFA15_eofS =
        "\25\uffff";
    static final String DFA15_minS =
        "\1\5\6\uffff\1\14\5\uffff\2\5\2\uffff\1\5\1\14\2\uffff";
    static final String DFA15_maxS =
        "\1\51\6\uffff\1\53\5\uffff\1\61\1\54\2\uffff\1\20\1\53\2\uffff";
    static final String DFA15_acceptS =
        "\1\uffff\1\1\1\2\1\3\1\4\1\5\1\6\1\uffff\1\11\1\12\1\13\1\14\1\15"+
        "\2\uffff\1\17\1\7\2\uffff\1\16\1\10";
    static final String DFA15_specialS =
        "\25\uffff}>";
    static final String[] DFA15_transitionS = {
            "\1\7\1\1\23\uffff\1\2\1\uffff\1\3\1\4\3\uffff\1\5\1\6\1\uffff"+
            "\1\10\1\11\1\12\1\uffff\1\13\1\14",
            "",
            "",
            "",
            "",
            "",
            "",
            "\1\17\7\uffff\1\15\3\uffff\1\20\22\uffff\1\16",
            "",
            "",
            "",
            "",
            "",
            "\1\20\6\uffff\1\20\10\uffff\3\20\13\uffff\1\21\15\uffff\1\20",
            "\1\22\46\uffff\1\20",
            "",
            "",
            "\1\23\10\uffff\3\24",
            "\1\17\7\uffff\1\20\3\uffff\1\20\22\uffff\1\16",
            "",
            ""
    };

    static final short[] DFA15_eot = DFA.unpackEncodedString(DFA15_eotS);
    static final short[] DFA15_eof = DFA.unpackEncodedString(DFA15_eofS);
    static final char[] DFA15_min = DFA.unpackEncodedStringToUnsignedChars(DFA15_minS);
    static final char[] DFA15_max = DFA.unpackEncodedStringToUnsignedChars(DFA15_maxS);
    static final short[] DFA15_accept = DFA.unpackEncodedString(DFA15_acceptS);
    static final short[] DFA15_special = DFA.unpackEncodedString(DFA15_specialS);
    static final short[][] DFA15_transition;

    static {
        int numStates = DFA15_transitionS.length;
        DFA15_transition = new short[numStates][];
        for (int i=0; i<numStates; i++) {
            DFA15_transition[i] = DFA.unpackEncodedString(DFA15_transitionS[i]);
        }
    }

    class DFA15 extends DFA {

        public DFA15(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 15;
            this.eot = DFA15_eot;
            this.eof = DFA15_eof;
            this.min = DFA15_min;
            this.max = DFA15_max;
            this.accept = DFA15_accept;
            this.special = DFA15_special;
            this.transition = DFA15_transition;
        }
        public String getDescription() {
            return "604:1: instr[boolean abreTabla] returns [String eixida, String locals] : ( bloque[$abreTabla] | fifi= IF PARI expr PARD i1= instr[true] ( ELSE i2= instr[true] )? | WHILE PARI expr PARD i3= instr[true] | FOR PARI INT ID ASIG e1= expr TO e2= expr STEP ( ADDOP )? ENTERO PARD i5= instr[false] | BREAK PYC | CONTINUE PYC | ref[true] cambio[$ref.error15] | ID ASIG NEW tiposimple CORI dims[s] CORD PYC | WRITELINE PARI expr PARD PYC | TRY bloque[true] bloquecatch | THROW ( NEW EXCEPTION PARI expr PARD )? PYC | EXPLAIN ID PYC | RETURN expr PYC | ID ASIG NEW ID PARI params[null] PARD PYC | subref[false] PARI params[null] PARD PYC );";
        }
    }
    static final String DFA25_eotS =
        "\12\uffff";
    static final String DFA25_eofS =
        "\12\uffff";
    static final String DFA25_minS =
        "\1\5\4\uffff\1\14\1\5\2\uffff\1\14";
    static final String DFA25_maxS =
        "\1\27\4\uffff\1\60\1\5\2\uffff\1\60";
    static final String DFA25_acceptS =
        "\1\uffff\1\1\1\2\1\3\1\4\2\uffff\1\6\1\5\1\uffff";
    static final String DFA25_specialS =
        "\12\uffff}>";
    static final String[] DFA25_transitionS = {
            "\1\5\6\uffff\1\4\10\uffff\1\1\1\2\1\3",
            "",
            "",
            "",
            "",
            "\1\7\1\10\4\uffff\2\10\4\uffff\2\10\4\uffff\3\10\12\uffff\1"+
            "\6\1\uffff\4\10",
            "\1\11",
            "",
            "",
            "\1\7\1\10\4\uffff\2\10\4\uffff\2\10\4\uffff\3\10\12\uffff\1"+
            "\6\1\uffff\4\10"
    };

    static final short[] DFA25_eot = DFA.unpackEncodedString(DFA25_eotS);
    static final short[] DFA25_eof = DFA.unpackEncodedString(DFA25_eofS);
    static final char[] DFA25_min = DFA.unpackEncodedStringToUnsignedChars(DFA25_minS);
    static final char[] DFA25_max = DFA.unpackEncodedStringToUnsignedChars(DFA25_maxS);
    static final short[] DFA25_accept = DFA.unpackEncodedString(DFA25_acceptS);
    static final short[] DFA25_special = DFA.unpackEncodedString(DFA25_specialS);
    static final short[][] DFA25_transition;

    static {
        int numStates = DFA25_transitionS.length;
        DFA25_transition = new short[numStates][];
        for (int i=0; i<numStates; i++) {
            DFA25_transition[i] = DFA.unpackEncodedString(DFA25_transitionS[i]);
        }
    }

    class DFA25 extends DFA {

        public DFA25(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 25;
            this.eot = DFA25_eot;
            this.eof = DFA25_eof;
            this.min = DFA25_min;
            this.max = DFA25_max;
            this.accept = DFA25_accept;
            this.special = DFA25_special;
            this.transition = DFA25_transition;
        }
        public String getDescription() {
            return "1286:1: base returns [Simbolo.TipoRetorno tipo, String eixida, boolean vector] : ( ENTERO | REAL | BOOLEANO | PARI expr PARD | ref[false] | subref[true] PARI params[null] PARD );";
        }
    }
    static final String DFA28_eotS =
        "\13\uffff";
    static final String DFA28_eofS =
        "\13\uffff";
    static final String DFA28_minS =
        "\1\10\2\5\1\uffff\4\5\2\uffff\1\14";
    static final String DFA28_maxS =
        "\1\63\2\21\1\uffff\3\5\1\14\2\uffff\1\30";
    static final String DFA28_acceptS =
        "\3\uffff\1\3\4\uffff\1\1\1\2\1\uffff";
    static final String DFA28_specialS =
        "\13\uffff}>";
    static final String[] DFA28_transitionS = {
            "\1\2\51\uffff\1\1\1\3",
            "\1\7\10\uffff\1\4\1\5\1\6\1\10",
            "\1\7\3\uffff\1\11\4\uffff\1\4\1\5\1\6\1\10",
            "",
            "\1\12",
            "\1\12",
            "\1\12",
            "\1\10\6\uffff\1\11",
            "",
            "",
            "\1\11\5\uffff\2\10\4\uffff\1\10"
    };

    static final short[] DFA28_eot = DFA.unpackEncodedString(DFA28_eotS);
    static final short[] DFA28_eof = DFA.unpackEncodedString(DFA28_eofS);
    static final char[] DFA28_min = DFA.unpackEncodedStringToUnsignedChars(DFA28_minS);
    static final char[] DFA28_max = DFA.unpackEncodedStringToUnsignedChars(DFA28_maxS);
    static final short[] DFA28_accept = DFA.unpackEncodedString(DFA28_acceptS);
    static final short[] DFA28_special = DFA.unpackEncodedString(DFA28_specialS);
    static final short[][] DFA28_transition;

    static {
        int numStates = DFA28_transitionS.length;
        DFA28_transition = new short[numStates][];
        for (int i=0; i<numStates; i++) {
            DFA28_transition[i] = DFA.unpackEncodedString(DFA28_transitionS[i]);
        }
    }

    class DFA28 extends DFA {

        public DFA28(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 28;
            this.eot = DFA28_eot;
            this.eof = DFA28_eof;
            this.min = DFA28_min;
            this.max = DFA28_max;
            this.accept = DFA28_accept;
            this.special = DFA28_special;
            this.transition = DFA28_transition;
        }
        public String getDescription() {
            return "1456:1: miembro[Simbolo clase] returns [String eixida, ArrayList<Simbolo> simbolos] : ( campo[clase] | metodo[clase] | propiedad );";
        }
    }
 

    public static final BitSet FOLLOW_clase_in_s53 = new BitSet(new long[]{0x0000000000000012L});
    public static final BitSet FOLLOW_CLASS_in_clase76 = new BitSet(new long[]{0x0000000000000020L});
    public static final BitSet FOLLOW_ID_in_clase78 = new BitSet(new long[]{0x0000000000000040L});
    public static final BitSet FOLLOW_LLAVEI_in_clase82 = new BitSet(new long[]{0x000C000000000100L});
    public static final BitSet FOLLOW_miembro_in_clase88 = new BitSet(new long[]{0x000C000000000180L});
    public static final BitSet FOLLOW_LLAVED_in_clase95 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_PUBLIC_in_metodo117 = new BitSet(new long[]{0x0000000000000200L});
    public static final BitSet FOLLOW_STATIC_in_metodo119 = new BitSet(new long[]{0x0000000000000400L});
    public static final BitSet FOLLOW_VOID_in_metodo121 = new BitSet(new long[]{0x0000000000000800L});
    public static final BitSet FOLLOW_MAIN_in_metodo123 = new BitSet(new long[]{0x0000000000001000L});
    public static final BitSet FOLLOW_PARI_in_metodo126 = new BitSet(new long[]{0x0000000000002000L});
    public static final BitSet FOLLOW_PARD_in_metodo128 = new BitSet(new long[]{0x0000000000000040L});
    public static final BitSet FOLLOW_bloque_in_metodo131 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_visibilidad_in_metodo139 = new BitSet(new long[]{0x000000000001C020L});
    public static final BitSet FOLLOW_tiposimple_in_metodo141 = new BitSet(new long[]{0x0000000000000020L});
    public static final BitSet FOLLOW_ID_in_metodo146 = new BitSet(new long[]{0x0000000000001000L});
    public static final BitSet FOLLOW_PARI_in_metodo148 = new BitSet(new long[]{0x000000000000A000L});
    public static final BitSet FOLLOW_args_in_metodo150 = new BitSet(new long[]{0x0000000000002000L});
    public static final BitSet FOLLOW_PARD_in_metodo152 = new BitSet(new long[]{0x0000000000000040L});
    public static final BitSet FOLLOW_bloque_in_metodo155 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_INT_in_tiposimple174 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_DOUBLE_in_tiposimple180 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_BOOL_in_tiposimple186 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_constdecl_in_decl207 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_vardecl_in_decl214 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_CONST_in_constdecl239 = new BitSet(new long[]{0x000000000001C000L});
    public static final BitSet FOLLOW_tiposimple_in_constdecl243 = new BitSet(new long[]{0x0000000000000020L});
    public static final BitSet FOLLOW_constid_in_constdecl251 = new BitSet(new long[]{0x00000000000C0000L});
    public static final BitSet FOLLOW_COMA_in_constdecl259 = new BitSet(new long[]{0x0000000000000020L});
    public static final BitSet FOLLOW_constid_in_constdecl266 = new BitSet(new long[]{0x00000000000C0000L});
    public static final BitSet FOLLOW_PYC_in_constdecl275 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_ID_in_constid297 = new BitSet(new long[]{0x0000000000100000L});
    public static final BitSet FOLLOW_ASIG_in_constid300 = new BitSet(new long[]{0x0000000000E00000L});
    public static final BitSet FOLLOW_ENTERO_in_constid307 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_REAL_in_constid312 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_BOOLEANO_in_constid317 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_tipo_in_vardecl342 = new BitSet(new long[]{0x0000000000000020L});
    public static final BitSet FOLLOW_varid_in_vardecl352 = new BitSet(new long[]{0x00000000000C0000L});
    public static final BitSet FOLLOW_COMA_in_vardecl358 = new BitSet(new long[]{0x0000000000000020L});
    public static final BitSet FOLLOW_varid_in_vardecl365 = new BitSet(new long[]{0x00000000000C0000L});
    public static final BitSet FOLLOW_PYC_in_vardecl374 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_ID_in_varid395 = new BitSet(new long[]{0x0000000001000002L});
    public static final BitSet FOLLOW_CORI_in_varid400 = new BitSet(new long[]{0x0000000002040000L});
    public static final BitSet FOLLOW_COMA_in_varid407 = new BitSet(new long[]{0x0000000002040000L});
    public static final BitSet FOLLOW_CORD_in_varid418 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_bloque_in_instr440 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_IF_in_instr452 = new BitSet(new long[]{0x0000000000001000L});
    public static final BitSet FOLLOW_PARI_in_instr454 = new BitSet(new long[]{0x0002000000E01020L});
    public static final BitSet FOLLOW_expr_in_instr457 = new BitSet(new long[]{0x0000000000002000L});
    public static final BitSet FOLLOW_PARD_in_instr461 = new BitSet(new long[]{0x0000037634E01060L});
    public static final BitSet FOLLOW_instr_in_instr467 = new BitSet(new long[]{0x0000000008000002L});
    public static final BitSet FOLLOW_ELSE_in_instr475 = new BitSet(new long[]{0x0000037634E01060L});
    public static final BitSet FOLLOW_instr_in_instr479 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_WHILE_in_instr492 = new BitSet(new long[]{0x0000000000001000L});
    public static final BitSet FOLLOW_PARI_in_instr494 = new BitSet(new long[]{0x0002000000E01020L});
    public static final BitSet FOLLOW_expr_in_instr500 = new BitSet(new long[]{0x0000000000002000L});
    public static final BitSet FOLLOW_PARD_in_instr506 = new BitSet(new long[]{0x0000037634E01060L});
    public static final BitSet FOLLOW_instr_in_instr512 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_FOR_in_instr523 = new BitSet(new long[]{0x0000000000001000L});
    public static final BitSet FOLLOW_PARI_in_instr525 = new BitSet(new long[]{0x0000000000004000L});
    public static final BitSet FOLLOW_INT_in_instr530 = new BitSet(new long[]{0x0000000000000020L});
    public static final BitSet FOLLOW_ID_in_instr532 = new BitSet(new long[]{0x0000000000100000L});
    public static final BitSet FOLLOW_ASIG_in_instr534 = new BitSet(new long[]{0x0002000000E01020L});
    public static final BitSet FOLLOW_expr_in_instr541 = new BitSet(new long[]{0x0000000040000000L});
    public static final BitSet FOLLOW_TO_in_instr545 = new BitSet(new long[]{0x0002000000E01020L});
    public static final BitSet FOLLOW_expr_in_instr550 = new BitSet(new long[]{0x0000000080000000L});
    public static final BitSet FOLLOW_STEP_in_instr555 = new BitSet(new long[]{0x0000000100200000L});
    public static final BitSet FOLLOW_ADDOP_in_instr558 = new BitSet(new long[]{0x0000000000200000L});
    public static final BitSet FOLLOW_ENTERO_in_instr563 = new BitSet(new long[]{0x0000000000002000L});
    public static final BitSet FOLLOW_PARD_in_instr565 = new BitSet(new long[]{0x0000037634E01060L});
    public static final BitSet FOLLOW_instr_in_instr571 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_BREAK_in_instr579 = new BitSet(new long[]{0x0000000000080000L});
    public static final BitSet FOLLOW_PYC_in_instr581 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_CONTINUE_in_instr588 = new BitSet(new long[]{0x0000000000080000L});
    public static final BitSet FOLLOW_PYC_in_instr590 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_ref_in_instr597 = new BitSet(new long[]{0x0000080000100000L});
    public static final BitSet FOLLOW_cambio_in_instr601 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_ID_in_instr612 = new BitSet(new long[]{0x0000000000100000L});
    public static final BitSet FOLLOW_ASIG_in_instr618 = new BitSet(new long[]{0x0000000800000000L});
    public static final BitSet FOLLOW_NEW_in_instr620 = new BitSet(new long[]{0x000000000001C000L});
    public static final BitSet FOLLOW_tiposimple_in_instr622 = new BitSet(new long[]{0x0000000001000000L});
    public static final BitSet FOLLOW_CORI_in_instr627 = new BitSet(new long[]{0x0000000000200000L});
    public static final BitSet FOLLOW_dims_in_instr629 = new BitSet(new long[]{0x0000000002000000L});
    public static final BitSet FOLLOW_CORD_in_instr633 = new BitSet(new long[]{0x0000000000080000L});
    public static final BitSet FOLLOW_PYC_in_instr639 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_WRITELINE_in_instr645 = new BitSet(new long[]{0x0000000000001000L});
    public static final BitSet FOLLOW_PARI_in_instr647 = new BitSet(new long[]{0x0002000000E01020L});
    public static final BitSet FOLLOW_expr_in_instr650 = new BitSet(new long[]{0x0000000000002000L});
    public static final BitSet FOLLOW_PARD_in_instr655 = new BitSet(new long[]{0x0000000000080000L});
    public static final BitSet FOLLOW_PYC_in_instr657 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_TRY_in_instr663 = new BitSet(new long[]{0x0000000000000040L});
    public static final BitSet FOLLOW_bloque_in_instr667 = new BitSet(new long[]{0x0000040000000000L});
    public static final BitSet FOLLOW_bloquecatch_in_instr672 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_THROW_in_instr679 = new BitSet(new long[]{0x0000000800080000L});
    public static final BitSet FOLLOW_NEW_in_instr682 = new BitSet(new long[]{0x0000008000000000L});
    public static final BitSet FOLLOW_EXCEPTION_in_instr684 = new BitSet(new long[]{0x0000000000001000L});
    public static final BitSet FOLLOW_PARI_in_instr686 = new BitSet(new long[]{0x0002000000E01020L});
    public static final BitSet FOLLOW_expr_in_instr688 = new BitSet(new long[]{0x0000000000002000L});
    public static final BitSet FOLLOW_PARD_in_instr692 = new BitSet(new long[]{0x0000000000080000L});
    public static final BitSet FOLLOW_PYC_in_instr699 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_EXPLAIN_in_instr705 = new BitSet(new long[]{0x0000000000000020L});
    public static final BitSet FOLLOW_ID_in_instr707 = new BitSet(new long[]{0x0000000000080000L});
    public static final BitSet FOLLOW_PYC_in_instr712 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_RETURN_in_instr718 = new BitSet(new long[]{0x0002000000E01020L});
    public static final BitSet FOLLOW_expr_in_instr720 = new BitSet(new long[]{0x0000000000080000L});
    public static final BitSet FOLLOW_PYC_in_instr722 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_ID_in_instr729 = new BitSet(new long[]{0x0000000000100000L});
    public static final BitSet FOLLOW_ASIG_in_instr731 = new BitSet(new long[]{0x0000000800000000L});
    public static final BitSet FOLLOW_NEW_in_instr733 = new BitSet(new long[]{0x0000000000000020L});
    public static final BitSet FOLLOW_ID_in_instr735 = new BitSet(new long[]{0x0000000000001000L});
    public static final BitSet FOLLOW_PARI_in_instr737 = new BitSet(new long[]{0x0002000000E03020L});
    public static final BitSet FOLLOW_params_in_instr739 = new BitSet(new long[]{0x0000000000002000L});
    public static final BitSet FOLLOW_PARD_in_instr742 = new BitSet(new long[]{0x0000000000080000L});
    public static final BitSet FOLLOW_PYC_in_instr744 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_subref_in_instr750 = new BitSet(new long[]{0x0000000000001000L});
    public static final BitSet FOLLOW_PARI_in_instr753 = new BitSet(new long[]{0x0002000000E03020L});
    public static final BitSet FOLLOW_params_in_instr755 = new BitSet(new long[]{0x0000000000002000L});
    public static final BitSet FOLLOW_PARD_in_instr758 = new BitSet(new long[]{0x0000000000080000L});
    public static final BitSet FOLLOW_PYC_in_instr760 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LLAVEI_in_bloque786 = new BitSet(new long[]{0x0000037634E3D0E0L});
    public static final BitSet FOLLOW_declins_in_bloque790 = new BitSet(new long[]{0x0000000000000080L});
    public static final BitSet FOLLOW_LLAVED_in_bloque795 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_CATCH_in_bloquecatch818 = new BitSet(new long[]{0x0000000000001000L});
    public static final BitSet FOLLOW_PARI_in_bloquecatch821 = new BitSet(new long[]{0x0000008000000000L});
    public static final BitSet FOLLOW_EXCEPTION_in_bloquecatch823 = new BitSet(new long[]{0x0000000000000020L});
    public static final BitSet FOLLOW_ID_in_bloquecatch825 = new BitSet(new long[]{0x0000000000002000L});
    public static final BitSet FOLLOW_PARD_in_bloquecatch828 = new BitSet(new long[]{0x0000000000000040L});
    public static final BitSet FOLLOW_bloque_in_bloquecatch830 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_instr_in_declins853 = new BitSet(new long[]{0x0000037634E3D062L});
    public static final BitSet FOLLOW_decl_in_declins861 = new BitSet(new long[]{0x0000037634E3D062L});
    public static final BitSet FOLLOW_ENTERO_in_dims890 = new BitSet(new long[]{0x0000000000040002L});
    public static final BitSet FOLLOW_COMA_in_dims897 = new BitSet(new long[]{0x0000000000200000L});
    public static final BitSet FOLLOW_ENTERO_in_dims901 = new BitSet(new long[]{0x0000000000040002L});
    public static final BitSet FOLLOW_ASIG_in_cambio928 = new BitSet(new long[]{0x0002000000E01020L});
    public static final BitSet FOLLOW_expr_in_cambio932 = new BitSet(new long[]{0x0000000000080000L});
    public static final BitSet FOLLOW_PYC_in_cambio936 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_PUNTO_in_cambio944 = new BitSet(new long[]{0x0000100000000000L});
    public static final BitSet FOLLOW_READLINE_in_cambio946 = new BitSet(new long[]{0x0000000000080000L});
    public static final BitSet FOLLOW_PYC_in_cambio949 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_eand_in_expr978 = new BitSet(new long[]{0x0000200000000002L});
    public static final BitSet FOLLOW_OR_in_expr990 = new BitSet(new long[]{0x0002000000E01020L});
    public static final BitSet FOLLOW_eand_in_expr1003 = new BitSet(new long[]{0x0000200000000002L});
    public static final BitSet FOLLOW_erel_in_eand1047 = new BitSet(new long[]{0x0000400000000002L});
    public static final BitSet FOLLOW_AND_in_eand1059 = new BitSet(new long[]{0x0002000000E01020L});
    public static final BitSet FOLLOW_erel_in_eand1072 = new BitSet(new long[]{0x0000400000000002L});
    public static final BitSet FOLLOW_esum_in_erel1115 = new BitSet(new long[]{0x0000800000000002L});
    public static final BitSet FOLLOW_RELOP_in_erel1127 = new BitSet(new long[]{0x0002000000E01020L});
    public static final BitSet FOLLOW_esum_in_erel1139 = new BitSet(new long[]{0x0000800000000002L});
    public static final BitSet FOLLOW_term_in_esum1187 = new BitSet(new long[]{0x0000000100000002L});
    public static final BitSet FOLLOW_ADDOP_in_esum1199 = new BitSet(new long[]{0x0002000000E01020L});
    public static final BitSet FOLLOW_term_in_esum1212 = new BitSet(new long[]{0x0000000100000002L});
    public static final BitSet FOLLOW_factor_in_term1259 = new BitSet(new long[]{0x0001000000000002L});
    public static final BitSet FOLLOW_MULOP_in_term1262 = new BitSet(new long[]{0x0002000000E01020L});
    public static final BitSet FOLLOW_factor_in_term1267 = new BitSet(new long[]{0x0001000000000002L});
    public static final BitSet FOLLOW_base_in_factor1311 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_NOT_in_factor1321 = new BitSet(new long[]{0x0002000000E01020L});
    public static final BitSet FOLLOW_factor_in_factor1326 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_PARI_in_factor1339 = new BitSet(new long[]{0x0000000100000000L});
    public static final BitSet FOLLOW_ADDOP_in_factor1341 = new BitSet(new long[]{0x0002000000E01020L});
    public static final BitSet FOLLOW_factor_in_factor1347 = new BitSet(new long[]{0x0000000000002000L});
    public static final BitSet FOLLOW_PARD_in_factor1358 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_ENTERO_in_base1391 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_REAL_in_base1406 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_BOOLEANO_in_base1421 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_PARI_in_base1433 = new BitSet(new long[]{0x0002000000E01020L});
    public static final BitSet FOLLOW_expr_in_base1435 = new BitSet(new long[]{0x0000000000002000L});
    public static final BitSet FOLLOW_PARD_in_base1446 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_ref_in_base1466 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_subref_in_base1498 = new BitSet(new long[]{0x0000000000001000L});
    public static final BitSet FOLLOW_PARI_in_base1501 = new BitSet(new long[]{0x0002000000E03020L});
    public static final BitSet FOLLOW_params_in_base1503 = new BitSet(new long[]{0x0000000000002000L});
    public static final BitSet FOLLOW_PARD_in_base1506 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_subref_in_ref1540 = new BitSet(new long[]{0x0000000001000002L});
    public static final BitSet FOLLOW_CORI_in_ref1555 = new BitSet(new long[]{0x0002000000E01020L});
    public static final BitSet FOLLOW_indices_in_ref1557 = new BitSet(new long[]{0x0000000002000000L});
    public static final BitSet FOLLOW_CORD_in_ref1584 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expr_in_indices1631 = new BitSet(new long[]{0x0000000000040002L});
    public static final BitSet FOLLOW_COMA_in_indices1643 = new BitSet(new long[]{0x0002000000E01020L});
    public static final BitSet FOLLOW_expr_in_indices1658 = new BitSet(new long[]{0x0000000000040002L});
    public static final BitSet FOLLOW_campo_in_miembro1692 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_metodo_in_miembro1701 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_propiedad_in_miembro1709 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_visibilidad_in_campo1732 = new BitSet(new long[]{0x0000037634E3D060L});
    public static final BitSet FOLLOW_decl_in_campo1734 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_PRIVATE_in_visibilidad1755 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_PUBLIC_in_visibilidad1762 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_DOUBLE_in_args1786 = new BitSet(new long[]{0x0000000000000020L});
    public static final BitSet FOLLOW_ID_in_args1790 = new BitSet(new long[]{0x0000000000040002L});
    public static final BitSet FOLLOW_COMA_in_args1793 = new BitSet(new long[]{0x0000000000008000L});
    public static final BitSet FOLLOW_DOUBLE_in_args1798 = new BitSet(new long[]{0x0000000000000020L});
    public static final BitSet FOLLOW_ID_in_args1803 = new BitSet(new long[]{0x0000000000040002L});
    public static final BitSet FOLLOW_PROPERTY_in_propiedad1828 = new BitSet(new long[]{0x0000037634E3D060L});
    public static final BitSet FOLLOW_tiposimple_in_propiedad1830 = new BitSet(new long[]{0x0000000000000020L});
    public static final BitSet FOLLOW_ID_in_propiedad1832 = new BitSet(new long[]{0x0000000000000040L});
    public static final BitSet FOLLOW_LLAVEI_in_propiedad1834 = new BitSet(new long[]{0x0030000000000080L});
    public static final BitSet FOLLOW_accesores_in_propiedad1836 = new BitSet(new long[]{0x0000000000000080L});
    public static final BitSet FOLLOW_LLAVED_in_propiedad1838 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_GET_in_accesores1859 = new BitSet(new long[]{0x0000000000000040L});
    public static final BitSet FOLLOW_bloque_in_accesores1861 = new BitSet(new long[]{0x0020000000000002L});
    public static final BitSet FOLLOW_SET_in_accesores1868 = new BitSet(new long[]{0x0000000000000040L});
    public static final BitSet FOLLOW_bloque_in_accesores1870 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_GET_in_accesores1879 = new BitSet(new long[]{0x0000000000080000L});
    public static final BitSet FOLLOW_PYC_in_accesores1881 = new BitSet(new long[]{0x0020000000000000L});
    public static final BitSet FOLLOW_SET_in_accesores1883 = new BitSet(new long[]{0x0000000000080000L});
    public static final BitSet FOLLOW_PYC_in_accesores1885 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_ID_in_tipo1905 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_tiposimple_in_tipo1911 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expr_in_params1933 = new BitSet(new long[]{0x0000000000040002L});
    public static final BitSet FOLLOW_COMA_in_params1936 = new BitSet(new long[]{0x0002000000E01020L});
    public static final BitSet FOLLOW_expr_in_params1938 = new BitSet(new long[]{0x0000000000040002L});
    public static final BitSet FOLLOW_ID_in_subref1968 = new BitSet(new long[]{0x0000080000000002L});
    public static final BitSet FOLLOW_PUNTO_in_subref1973 = new BitSet(new long[]{0x0000000000000020L});
    public static final BitSet FOLLOW_ID_in_subref1977 = new BitSet(new long[]{0x0000080000000002L});

}